LINQ Sorgularında Left/Right Join İşlemleri

Bu yazıda outer join işlemlerini Linq sorgularıyla nasıl gerçekleştirebileceğimize bakacağız. Inner join işleminde birden fazla tablonun sadece istenen kolonlarının eşleştiği bilgileri getirilmesi sağlanır. Ancak bazı durumlarda tabloların alınacak kesişim kümesini biz belirlemek isteyebiliriz. Bunu iki basit veri tipi ile açıklayalım. Kitap ve SatisTipi adlı iki sınıf olsun.

public class Kitap
    {
        public int KitapNo { get; set; }
        public string KitapAdi { get; set; }
    }
    public class SatisDetay
    {
        public int SatisNo { get; set; }
        public int KitapNo { get; set; }
        public string SatisTipi { get; set; }
    }

 

Örnek verilerimiz de aşağıdaki gibi olsun.

List<Kitap> ktpListe = new List<Kitap>
                {
                    new Kitap{KitapNo=1, KitapAdi="Kaiken"},
                    new Kitap{KitapNo=2, KitapAdi="Satori"},
                    new Kitap{KitapNo=3, KitapAdi="Şibumi"},
                    new Kitap{KitapNo=4, KitapAdi="Kişisel Bir Sorun"},
                    new Kitap{KitapNo=5, KitapAdi="Kappa"}
                };

            List<SatisDetay> stsListe = new List<SatisDetay>
                {
                    new SatisDetay{SatisNo=1, KitapNo=1, SatisTipi="Internet"},
                    new SatisDetay{SatisNo=2, KitapNo=2, SatisTipi="Magaza"},
                    new SatisDetay{SatisNo=3, KitapNo=3, SatisTipi="Internet"},
                    new SatisDetay{SatisNo=4, KitapNo=3, SatisTipi="Internet"}
                };

 

Eğer satışı gerçekleşen kitapların adını listelemek isteseydik inner join işlemini şu şekilde kullanabiliriz.

var kitaplar = (from k in ktpListe
                            join s in stsListe on k.KitapNo equals s.KitapNo
                            select k.KitapAdi
                                    ).Distinct();

 

Ancak satışı gerçekleşmeyen kitapları da aynı liste de görüntülemek isteseydik bu kez left join işlemi yapmamız gerekir. Satışı gerçekleşmeyen kitaplar için satış tipi NULL gelecektir. Burada DefaultIfEmpty() metodu dikkatinizi çekmiştir. a olarak ifade ettiğimiz tablodan b olarak ifade ettiğimiz SatisDetay tablosunda karşılığı boş olan kolonları da getirmesini sağladık.

var kitaplar = (from k in ktpListe
                            join s in stsListe on k.KitapNo equals s.KitapNo
                            into a from b in a.DefaultIfEmpty(new SatisDetay())
                            select k.KitapAdi
                                    ).Distinct();

 

Eğer mevcut tüm satış tiplerini getirmek istersek right join işlemi yapabiliriz.

var satisTipleri = (from s in stsListe
                            join k in ktpListe on s.KitapNo equals k.KitapNo
                            into a from b in a.DefaultIfEmpty(new Kitap())
                            select s.SatisTipi
                                   ).Distinct();

 

 

 

VQ5XP

Reklamlar

LINQ Sorgularında If Kontrolü

Bazı durumlarda LINQ sorgularını çalıştırırken if durumu ile kontrol gerekebilir. Örneğimizde DataModel adlı bir model sınıftan LINQ ile OrnekData tablosundan 3 adet bilgi çekelim.

IQueryable<DataModel> q = (from od in OrnekData
                        where od.FirmaId != null
						select new DataModel
                               {
                                CalisanAdi = od.CalisanAdi,
                                Id = od.Id,
                                KullaniciAdi = od.KullaniciAdi.HasValue ? od.KullaniciAdi : null,
                                Sifre = od.Sifre.HasValue ? od.Sifre : 0
                                });

public class DataModel
        {
            public string CalisanAdi { get; set; }
            public int? Sifre { get; set; }
            public string KullaniciAdi { get; set; }
        }

 

Kullanıcının kullanıcı adı ve şifresinin olup olmadığını HasValue özelliğiyle kontrol ettik eğer yoksa null ve 0 değerlerinin kullanılmasını sağladık.

ASP.NET MVC’de Bir View İçinde Birden Çok Model Kullanımı

View’ler içinde model kullanmak istediğimizde bir modele bağlı kalmak istemediğimiz durumlar olabilir. Örneğin aşağıdaki gibi bir tanımlama yaparsak View, en son tanımlanan Model’i geçerli sayar.

@model StuPerformance.Models.Exam
@model StuPerformance.Models.Student

 

Bunun yerine kullanmak istenen Model’lerin bir araya toplandığı bir üst sınıf olarak düşünülebilecek Model sınıfı kullanabiliriz.

Örneğin Class ve Lecture adında iki modelimiz olsun. Buradaki verileri iki adet DropDownList aracılığıyla View içerisinde göstermeye çalışalım. İlk olarak Models klasörümüze bu iki modeli içeren ayrı bir class oluşturuyoruz.

namespace StuPerformance.Models
{
    public partial class ModelLists
    {
        public Class ClassM { get; set; }
        public Lecture LectureM { get; set; }
    }
}

 

ModelLists adını verdiğimiz bu modeli ilgili view içinde tanımlayarak hem Class, hem Lecture modellerini kullanabiliriz.

@model StuPerformance.Models.ModelLists

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
<div class="form-group">
    @Html.LabelFor(model => model.StudentExamM, "Class", new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("ClassId", String.Empty)
        @Html.ValidationMessageFor(model => model.ClassM.ClassId)
    </div>
    </div>
<div class="form-group">
    @Html.LabelFor(model => model.StudentExamM, "Lecture", new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("LectureID", String.Empty)
        @Html.ValidationMessageFor(model => model.LectureM.LectureID)
    </div>
</div>
} 

 

Burada ilk DropDownList için model.ClassM.ClassId, diğer DropDownList için model.LectureM.LectureID kullanılmıştır.

ASP.NET MVC’de Mevcut Veritabanından Code First İle Model Oluşturma

Son yıllarda sık kullanılan Code First ile modelleme, var olan bir veritabanını esas alarak tersine mühendislik yoluyla yapılabiliyor. Aslında bu seçenek, Entity Framework 6.1.1 ile gelen bir özellik. O yüzden ilk olarak buradan Entity Framework 6.1.1 sürümünü indirip kuruyoruz. Örneğin anlaşılabilir olması için veritabanını oldukça basit seçtim.

1Projemize sağ tıklayıp Add->New Item->ADO.NET Entity Data Model seçiyoruz. Modelimize bir isim verdikten sonra karşımıza aşağıdaki gibi bir seçenek çıkıyor. Burada Code First From Database seçeneğini işaretliyoruz.

2Daha sonra önceden oluşturulmuş veritabanımızı belirterek connectionString ve ayarlamaların yapılmasını sağlıyoruz.

3Oluşturulan Haber.cs, Kategori.cs ve HaberContext.cs modellerini görebiliriz.

[Table("Haber")]
    public partial class Haber
    {
        public int Id { get; set; }

        [Required]
        [StringLength(50)]
        public string HaberAd { get; set; }

        [Column(TypeName = "ntext")]
        public string HaberMetin { get; set; }

        public int? KategoriId { get; set; }

        public virtual Kategori Kategori { get; set; }
    }

[Table("Kategori")]
    public partial class Kategori
    {
        public Kategori()
        {
            Haber = new HashSet<Haber>();
        }

        public int Id { get; set; }

        [StringLength(50)]
        public string KategoriAd { get; set; }

        public virtual ICollection<Haber> Haber { get; set; }
    }

public partial class HaberContext : DbContext
    {
        public HaberContext()
            : base("name=HaberContext")
        {
        }

        public virtual DbSet<Haber> Haber { get; set; }
        public virtual DbSet<Kategori> Kategori { get; set; }
        public virtual DbSet<sysdiagrams> sysdiagrams { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Haber>()
                .Property(e => e.HaberAd)
                .IsUnicode(false);

            modelBuilder.Entity<Kategori>()
                .Property(e => e.KategoriAd)
                .IsUnicode(false);
        }
    }

Web.config içinde Context adının kullanıldığı bağlantı ayarı da aşağıdaki gibi otomatik olarak oluşturulmaktadır.

<connectionStrings><add name="HaberContext" connectionString="data source=nevra-nevra\sqlexpress;initial catalog=Haber;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings></configuration>

İyi Bir Bakıma Rahatsızlık Vericidir: Fargo

Franz Kafka, Aforizmalar’da şöyle der; İyi, bir bakıma rahatsızlık vericidir. 1996 yılında yapılmış filmine tam olarak bağlı kalmasa da göndermelerde bulunan ve gerçek bir hikayeyi konu edindiğini vurgulayan çarpıcı biri dizi Fargo. Dizide olup biteni(2. sezonu yakında) iki grup arasına almak istesek bu gruplar İyiler ve Kötüler olurdu mutlaka. Ama bunlar bildiğimiz ya da genel kabul görmüş özellikleri barındıran insanlar değil.

1987 yılında Minnesota eyaletinde yaşanmış bu hikayenin ana karakterlerinden Lester Nygaard bir yandan küçüklüğünden beri itilip kakılan, korkak ve beceriksiz bir sigorta şirketi çalışanını diğer yandan sessiz ve içten öldüren, masum olmayan bir adam. Bu iki karanlık karakteri büyük bir başarıyla canlandırmış Martin Freeman. Öyle ki bir diyalogla, bir hareketle hatta sessiz kalışıyla gerçek bir psikopat havası yaşatıyor her bölümde.

  Continue reading “İyi Bir Bakıma Rahatsızlık Vericidir: Fargo”

Özelleştirmeye Dair Sorunlar

Özelleştirme ifadesi, hangi dönemde sözü geçerse geçsin vatandaşı huzursuz eden ve gelecekte sorun teşkil edecek bir adım gözüyle bakılmıştır. Maliye Bakanı Mehmet Şimşek öncülüğünde hazırlanan -dev özelleştirme hamlesi, ikinci özelleştirme dalgası gibi ifadelerle anılmaya başlayan- plan, ülkenin köklü sorununu da gündeme(!) getirdi. Özelleştirme nedir, ne değildir? Çok tehlikeli midir, savunulması doğru bir altyapıya mı dayanıyor? Soracak çok şey var ve cevaplar çok da karışık değil.

Özelleştirme, temel olarak Kamu İktisadi Teşebbüsleri’nin (KİT) mülkiyetinin ve yönetiminin tümünü veya bir kısmını (en az %51) özel sektöre doğrudan ya da dolaylı yollarla devretmektir. KİT ise kamu kaynaklarını kullanarak ekonomik yaşamını devam ettiren devlet kuruluşlarını kapsayan bir kavram. Bu yazıda özelleştirilen kurumları listelemek amacında değilim, başta Maliye Bakanının ve özelleştirme taraftarlarının öne sürdüğü yorumlarının ve savunma noktalarının ne kadar bozuk bir zeminde gelişerek yayıldığını göstermek ve bu konuda fikir edinmek yeterli olacaktır.

Continue reading “Özelleştirmeye Dair Sorunlar”

Kayseri’nin İlk Hackathon’u Erciyes Teknopark’ta Gerçekleşti

Microsoft Açık Akademi‘nin destek verdiği ve Kayseri‘de yapılan ilk hackhathon etkinliği Meet4App, Android, iOS, Windows Phone ve Windows 8 platformlarında uygulama geliştirmek isteyen üniversite öğrencileriyle yapıldı. 21 Aralık’ta başlayan ve 24 saat süren etkinlikte Microsoft ürünleri kullanılarak ve MSP‘lerin de desteğiyle çok sayıda uygulama geliştirildi.

Etkinlikte yer alan katılımcılara verilen Windows Azure hesabı için de en iyi kazanımlardan biriydi.

1519933_675706945803155_745917714_o

d
Teknopark Sera’dan bir kare

İlgili Haberler

Microsoft Blog

Elektrikport

Erciyesera

Webrazzi

Facebook Etkinlik Sayfası