Tek Fotoluk İpucu–71–IQueryable veya IEnumerable

Merhaba Arkadaşlar,

Bu sefer ki ip ucumuz biraz daha kışkırtıcı aslında. Aşağıdaki fotoğrafı bir inceleyin öncelikle ve nasıl bir fark olabileceğini düşünmeye çalışın. Yani kafanızda kod parçasını debug etmeye gayret edin.

(Visual Studio ve benzeri herhangibir geliştirme aracı kullanmamanız şiddetle tavsiye edilir Yell)

tfi_71

Tabi fotoğrafa bakınca durumu görmek zor olabilir. Ama fotoğrafın arkasında yatan gerçeklere bakarsak(örneğin SQL Server Profiler yardımıyla) customerList1 üzerinden uygulanan Take(10) çağrısı için aşağıdaki SQL sorgusunun çalıştırıldığını görürüz.

SELECT TOP (10) 
[Extent1].[CustomerId] AS [CustomerId], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[Company] AS [Company], 
[Extent1].[Address] AS [Address], 
[Extent1].[City] AS [City], 
[Extent1].[State] AS [State], 
[Extent1].[Country] AS [Country], 
[Extent1].[PostalCode] AS [PostalCode], 
[Extent1].[Phone] AS [Phone], 
[Extent1].[Fax] AS [Fax], 
[Extent1].[Email] AS [Email], 
[Extent1].[SupportRepId] AS [SupportRepId] 
FROM [dbo].[Customer] AS [Extent1] 
ORDER BY [Extent1].[LastName] ASC, [Extent1].[FirstName] ASC

customerList2 üzerinden yapılan Take(10) içinse benzer bir sorgu üretilir.

SELECT 
[Extent1].[CustomerId] AS [CustomerId], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[Company] AS [Company], 
[Extent1].[Address] AS [Address], 
[Extent1].[City] AS [City], 
[Extent1].[State] AS [State], 
[Extent1].[Country] AS [Country], 
[Extent1].[PostalCode] AS [PostalCode], 
[Extent1].[Phone] AS [Phone], 
[Extent1].[Fax] AS [Fax], 
[Extent1].[Email] AS [Email], 
[Extent1].[SupportRepId] AS [SupportRepId] 
FROM [dbo].[Customer] AS [Extent1] 
ORDER BY [Extent1].[LastName] ASC, [Extent1].[FirstName] ASC

Surprised smile Uppsss!!! Benzer bir sorgu derken!

IQueryable üzerinden yapılan Take(10) çağrısı dikkat edileceği üzere TOP 10 ifadesini kullanmıştır. Peki ya IEnumerable üzerinden yapılan Take(10) çağrısı ne yapmıştırWinking smile Aslında tüm liste çekilmiş sonrasında Take metodu, belleğe aldığı koleksiyon seti üzerinden ilk 10luk parçayı almıştır.

Sanırım artık IQueryable mı olsun, IEnumerable mı olsun çıktı sonucu ya da var anahtar kelimesini kullanırsak hangisini göz önüne alır, hangisi daha avantajlıdır diye bir kuşku oluşturmuş bulunmaktayım içinizde Smile E hadi hayırlısı diyelim.

Başka bir ipucunda görüşmek dileğiyle.

Yorumlar (6) -

  • Bunu bilmiyordum bak süper oldu bu tarz ipuçları püf noktalar bekliyoruz hocam teşekkür ederim.
  • Burak bey ben Kadir Has Üniversitesi öğrencisiyim.Bu haftasonu üniversitemize workshop için gelicekmişsiniz.Uzun zamandır sizi ve yazılarınızı takip ediyordum sizinle karşılıklı olarak çalışma yapıcağım için çok mutluyumSmile şimdiden size çok teşekkür ederim bizleri kırmayıp okulumuza geliceğiniz için.
  • Doğrudur. Kısmet olursa görüşüyor ve biraz WCF bakıyor olacağız ;)
  • Güzel ipucu Smile içime gerçekten kuşku düşürdünüz "var" konusunda Laughing
  • foreach döngüleri içerisinde var ile tanımlı olan değişkenleri Customer tipi ile tanımlarsak da aynı sonuçlara varacağız aslında.

    Yani

    foreach (Customer customer in customerList1.Take(10))
                        Console.WriteLine(customer.LastName);

                    foreach (Customer customer in customerList2.Take(10))
                        Console.WriteLine(customer.LastName);

    şeklinde denersek de yine aynı sonuçlar oluşacak. Dolayısıyla bu senaryoda Take metodunun IQueryable ve IEnumerable döndürme durumlarında farklı davranış sergilediğini düşünüyorum ben.
  • pdr
    Valla çok açıklayıcı oldu çok teşekkürler Smile

Yorum ekle

Loading