LINQ to Entities ile Sorgulama !!!


Kullanacağımız veritabanı tabloları

Kullanacağımız Entity Date Model

LINQ to Entities’e başlamadan önce bilmemiz gereken bazı terimler.

Projection
Tüm Entity’i sorgulamak yerine, belli başlı özelliklerini sorgulamaya denir. Örneğin;

from u in context.Urunler

select new {u.UrunAd, u.Durum}

Eager Loading
İlişkili tablonun verilerini asıl tablonun sorgusuyla birlikte döndürmeye denir. Örneğin; Siparis Entity’sinin eager-load’u SiparisDetay Entity’sidir. Sorgu sonucunda Siparis ve SiparisDetay verileri tek bir sorguda elde edilir.

Deferred Loading
Asıl sorgulalan tablonun verini sorgularken, onunla ilişkili olan tablonun da verilerini açık bir şekilde talep ettiğimizi belirtene kadar ertelemeye denir. Örneğin; Siparis tablosuna bir sorgu yaparken SiparisDetay tablosunun verilerini de ayrıca sorgulamak isteyebiliriz. Bu sorgulama otomatik olarak bilinçsiz bir şekilde gerçekleşirse, buna Lazy-Loading denir.

Navigating
Bir entity’de onunla ilişkili olan entity’nin verilerinde dolaşmaya denir. Örneğin; Siparis entity’sinin SiparisDetay özelliği aracılığıyla SiparisDetay entity’sinin verilerinde dolaşmak gibi.

Entity’lere yaptığımız sorgularda Projection kullandığımız zaman geriye anonim tipler döner. Fakat anonim tiplerde change tracking (değişiklik takibi) ve güncelleme yapılamaz. Projection yaptığımız zaman dönen değişkene let anahtar kelimesiyle bir isim verebiliriz.

Örneğin:

1
2
3
var urunler = from u in context.Urunler
              let UrunAdi = new { u.UrunAd, u.Durum }
              select UrunAdi;

C#’da isimlendirmeyi select ifadesinde değil de, let anahtar kelimesiyle ayrıca kullanmamız gerektiğine dikkat edelim.

LINQ metoduyla projection kullanımı:

1
2
3
var urunler = context.Urunler
    .Where(u => u.UrunAd == "TV")
    .Select(u => new { u.UrunAd, u.Durum });

Birkaç yeni terim daha: Navigation Collection, Navigation Reference, Entity Collection, Entity Reference

Navigation Reference – Entity Reference
Tek nesne döndüren navigasyon özelliğine Navigation Reference denir. Örneğin SiparisDetay entity’sinin navigasyon özelliğinden Siparis entity’sinin verisine eriştiğimizde tek nesne döndüreceği aşikardır. Burada eriştiğimiz Siparis entity’si ise EntityReference olarak adlandırılıyor. Ya da EntityRef.

Entity Referance ile projection:

1
2
3
4
var siparisDetaylari = from s in context.SiparisDetaylari
               where s.Siparis.Tarih > new System.DateTime(2010, 1, 1)
               orderby s.Siparis.Tarih
               select new { s, s.Siparis.Tarih };

Navigation Collection – Entity Collection
Bire-çok ilişkili entityler’de, örneğin Siparis-SiparisDetay entitylerinde, Siparis entity’sinin navigasyon özelliği ile SiparisDetay entity’sinin verilerinde dolaşmaya Navigation Collaction; verilerinde dolaştığımız SiparisDetay entity’sin’den dönen verilere de Entity Collection denir.

Entity Collection’ın belli başlı değerlerini sorgulama:

1
2
3
4
5
6
7
8
var urunler = from u in context.Urunler
               select new
               {
                   u.UrunAd,
                   u.Durum,
                   siparisler = from s in u.SiparisDetay
                                   select new { s.SiparisDetayId, s.SiparisId }
               };

Entity Collection ile filtreleme:

1
2
3
var urunler = from u in context.Urunler
               where u.SiparisDetay.Any(s => s.SiparisDetayId == 2)
               select u;

LINQ ile Agregasyon:

Count hariç, MAX gibi agregasyon işlemleri için bir değer bekleniyor. Lambda ifadesi ile bunu sağlayabiliriz.

Entity Collection ile filtreleme:

1
2
var urunler = from u in context.Urunler
               select new { u.UrunAd, MaxId = u.SiparisDetay.Max(s => s.SiparisDetayId) };

JOIN kullanarak LINQ to Entities Sorgusu:

1
2
3
4
5
6
7
8
var siparisler = from s in context.Siparisler
                 join viewS in context.vwSiparisler on s.SiparisId equals viewS.SiparisId
                 select new
                 {
                     s.SiparisId,
                     viewS.UrunAd,
                     viewS.Tarih
                 };

Nested LINQ Sorgusu:

Join alternatifi. Where ile ilişkilendirdiğimiz Entity’ye sorgu yapıyoruz . Durum için yaptığımız sorgu IQueryable döndürdüğü için FirstorDefault kullandık.

1
2
3
4
5
6
7
8
9
var siparisler = from viewS in context.vwSiparisler
                 select new
                 {
                    viewS.UrunAd,
                    viewS.Tarih,
                    Durum = (from s in context.Siparisler
                                 where s.SiparisId == viewS.SiparisId
                                 select s.Durum).FirstOrDefault()
                 };

LINQ ile Gruplama:

1
2
3
4
5
6
7
8
9
var urunler = from u in context.Urunler
              group u by u.UrunAd into urunGrupla
              orderby urunGrupla.Key
              select new { Urun = urunGrupla};
foreach (var item in urunler)
{
    Console.WriteLine(item.Urun.Key);
}

Gruplama, Max, Count ve İsimlendirme:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var siparisler = from s in context.vwSiparisler
                 group s by s.UrunAd into siparisGrup
                 orderby siparisGrup.Key
                 select new
                 {
                    Urun = siparisGrup.Key,
                    MaxTarih = siparisGrup.Max(s => s.Tarih),
                    Adet = siparisGrup.Count()
                 };
foreach (var item in siparisler)
{
    Console.WriteLine("Urun: {0}, Tarih: {1}, Adet: {2}",item.Urun, item.MaxTarih, item.Adet);
}

Gruplama ve Filtreleme:

1
2
3
4
5
6
7
8
var siparisler = from s in context.vwSiparisler
                 group s by s.UrunAd into siparisGrupla
                 where siparisGrupla.Count() >= 2
                 select new
                 {
                    Urun = siparisGrupla.Key,
                    Adet = siparisGrupla.Count()
                 };
Share Button

Comments 0

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

* Copy This Password *

* Type Or Paste Password Here *

12.588 Spam Comments Blocked so far by Spam Free Wordpress

More From: Asp.NET

DON'T MISS