C# Entity Framework 6.0’da Linq İle Tüyolar

Selamlar,

Bu makalede Linq ile işinize yaracak ya da gözden kaçırmış olabileceğiniz, birkaç konudan bahsetmek istiyorum.

1-) IEnumerable<T> query:

  • Aşağıdaki kod satırnın çıktısı ne olur ? Sonuç null. Neden, çünkü “IEnumerable” query hemen çalıştırılmaz. “numbers.Clear()” ile dizi temizlendikten sonra, “foreach” içinde çağrıldığı için, null değer döner.

Çıktı Ekranı:

  • Peki aynı sorguyu aşağıdaki gibi List<T> ile yapılsa idi, sonuc ne olurdu? “List<T>()” sorguları hemen işletildiği için, sorgu sonucu listenin silinmesinden etkilenmez ve sonuçlar gelirdi.

Çıktı Ekranı:

  • Son olarak, aşağıdaki sorgunun sonucu ne olurdu? IEnumerable, gerçekten çağrıldıktan sonra çalıştırıldığı için, sorguya sonradan müdahale edilebilmiş ve “factor” katsayısının ilk hali ile değil, son hali ile ilgili sorgu çağrılmıştır.

Çıktı Ekranı:

  • Aşağıda görüldüğü gibi Linq ile “where” koşulları peş peşe eklenerek ilgili sorgu çağrılabilir. Amaç cümle içinden “a,t,u,l,e” harflerinin çıkarılmasıdır.

Çıktı Ekranı:

Pratik Yol: Eğer aşağıdaki gibi bir sorgu yazılır ise de, yine aynı sonuç alınır. “Where”‘ler peş peşe sona eklenir. Ve ilgili query en son çalıştırılarak, yine aynı sonuç alınır.

Not:query = query.Where( c => c != excepts[i] ) Şeklinde kod yazılsa idi, “i” değeri son olarak “5” değerini alacağı ve query enson foreach anında çağrılacağı için, “IndexOutOfRangeException” hatası alınacakdı. Çünkü excepts[5] dizisinin, 5. elemanı yok.

Çıktı Ekranı:

2-) Anonymous Types ve “into” Keyword:

Aşağıdaki örnekde görüldüğü gibi, “names” dizisi üzerinde “select new{ }” ile anonymous tipinde “Original” ve “Change” propertylerine sahip bir Liste üzerinde işlem yapılarak, “into” keyword’ü ile “temp” değişkenine atanmış ve ek filitrelemeler, bu atanan “temp” üzerinden yapılmıştır.

Kısaca bir liste üzerinde, kendisi ve üzerinde işlem yapılacak eşleniği şeklinde 2 property olarak oluşturulmuş , eşleneği üzerinde çeşitli işlemler yapılıp, filitreden geçirilmiştir. Bu filitreleri geçen elemanların da orginal hali,  ekrana bastırılmıştır.

Çıktı Ekranı:

3-) Interpreted and Local Queryler:

  • Aşağıdaki örnekde, custom yazılan bir filter’ın, ilgli linq query’e nasıl ekleyebileceği görülmektedir. Pair()IEnumerable<string>” Extension methodu bize, gelen sorgu sonucunu ikili eşleştirerek geriye dönmektedir. Bu şekilde normal Linq query’e, kendi sorgularımızı attach etmiş oluruz.

Çıktı Ekranı:

  • .Net 6.0’da, artık RegEx queryler (ya da herhangi bir custom query), Linq query içine “AsEnumerable()” yazmadan aşağıdaki gibi eklenebilir. Aşağıdaki örnekde, ilk önce tüm mailler büyük harfe çevrilip, “GMAIL”  olanları belirlenmiş, ve sonra checkMail RegEx’i ile geçerli olmayanlar filitrelenmiştir.

Çıktı Ekranı:

4-) “let” Keyword:

  • Aşağıda görüldüğü gibi, uzunluğu 3’den büyük isim sorgusu “let” ile “u” değişkenine büyük harfe çevrilerek aktarılmış, daha sonra da “Y” harfi ile bitenler sorgulanmıştır.

Çıktı Ekranı:

  • LinqPad 6 ile default gelen DemoDB üzerinden, aşağıdaki query yazılmıştır. LinqPad, aynı Sql Management Studio gibi linq query yazmak için kullanılan bir editördür. “Customer” ve “Order” tabloları, join ile bağlanıp iki tablodan data çekilmiş, daha sonra “let” ile Orderslara ait OrderDetaillardan fiyatı “UnitPrice >60 ” büyük olanlar, Anonymous tipde {ProductName ve UnitPrice} => highValueP’ye “let” ile atanmıştır.
    • Son where koşulunda => Ürün fiyatı 60’dan büyük, 2den fazla ürünü olanlar, yeni bir anonymous tip ile {ContactName, Purchas} fiyatı ile geriye dönülmüştür. Bazen ara sorguları bir değişkene atayarak, devam sorguları da bunun üzerinden yapmak, hem kod okunaklığını arttırır hem de oluşan filitre sonucu üzerinden toplu işlem yapmaya izin verir.

Çıktı Ekranı:

5-)Indexed Filtering:

Aşağıda görüldüğü gibi, satır index’i where koşulunda “i” ile çekilmiştir. Çift olan satırlar ( i % 2 ==0) çekilip, tek satırlar filitrelenmiştir.

6-) SelectMany:

  • Aşağıdaki örnekde, bir dizi elemanı kendisi ile cross match olmaktadır. Aynı Ad ve Soyad, iki kere match olmasın diye, “n != n2” koşulu konulmuştur..

Çıktı Ekranı:

  • Aşağıdaki örnekde, aslında iç içe 2 döngü bulunmaktadır. Öncelikle tam isim listesi çekilir. Sonra SelectMany => ile Cross Match yapılmaktadır. Yani herbir isim, “fullName.Split()” ile ad, soyad olarak 2 boyutlu bir diziye dönüştürülür, ve herbir eleman yani “ad” ve “soyad” tek tek “tam ad” ile matchlenir. Örn : “{ [Anne , Anne Williams], [Williams, Anne Williams], [John, John Fred], [Fred, Jhon Fred ]}” gibi. Aynı matchlemenin, ad ve soyad için 2 kere tekrarlanmaması amacı ile, “fullName.Split()[0] == name” filitresi konulmuştur. Böylece ilgili eşlemenin, sadece “ad” için yapılması sağlanmıştır. Soyad için bir daha tekrarlanmamıştır.

Çıktı Ekranı:

7-) GroupBy Count :

  • Aşağıdaki örnekde, aynı olan hayvan sayısına göre bir gruplama yapılmış ve tekrar eden hayvan sayısına göre,  büyükten küçüğe doğru sıralanmıştır. Ekran çıktısı olarak, hayvan adı ve toplam tekrarlama sayısı yazılmıştır.

Çıktı Ekranı:

  • Aşağıda görülen örnekde Customer ve Customer’a satılan ürünlerin fiyat toplamı(“Sum(UnitPrice)), müşteri adına(“ContactName“) göre gruplanıp, fiyatlar büyükten => küçeğe ve müşteri adına göre listelenmektedir.

LinqPad ile alınan yukarıdaki Linq query’nin sql karşılığı aşağıdaki gibidir :

Sonuç Ekranı:

Geldik bir makelenin daha sonuna. Bu makalede Linq query üzerinde, dikkat edilmesi gereken bir kaç gözden kaçabilecek konu üzerinde detaylıca konuştuk. Entity 6.0 ile Linq performansı muazzam bir hale gelmiştir. Özellikle yapılan testler gösteriyor ki, Entity 6.0, 5.0’dan %70 daha hızlı ve %43 daha az memoryde yer kaplamaktadır. Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Kaynaklar:

  • C# 9.0 in a Nutshell Book

C# 9.0 Pocket Reference - Free Download : PDF - Price, Reviews - IT Books

 

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.