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() }; |
Comments 0