LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?

Cevap

LINQ sorgularının çoğu (Where, Select, OrderBy...) tanımlandığı anda çalışmaz; yalnızca bir "tarif" oluşturur. Sorgu, sonuç üzerinde enumerate edildiğinde (foreach, ToList(), Count(), First()) çalışır. Buna deferred execution denir.

var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Where(n => n > 1);

numbers.Add(4);

Console.WriteLine(string.Join(",", query)); // ?
Console.WriteLine(query.Count());           // ?

Çıktı:

2,3,4
3

Where filtrelemesi Add(4)'ten sonra, enumerate edilirken çalıştığı için 4 de sonuca girer.

Tuzak: çoklu enumeration

IEnumerable<User> active = users.Where(u => IsActiveExpensive(u));

if (active.Any())                  // 1. çalıştırma
    foreach (var u in active) ...  // 2. çalıştırma

Sorgu her enumeration'da baştan çalışır. EF Core'da bu, aynı SQL'in iki kez veritabanına gitmesi demektir. Sonuç birden fazla kullanılacaksa bir kez ToList() ile materialize edin.

Immediate execution yapan operatörler

ToList, ToArray, ToDictionary, Count, Sum, Max, First, Single, Any, All. Bunlar sorguyu hemen çalıştırır.

Closure tuzağı

Sorgu, yakaladığı değişkenin çalıştırma anındaki değerini kullanır:

int min = 1;
var q = numbers.Where(n => n > min);
min = 3;
q.ToList(); // [4] : min artık 3

Kendi yield return kullanan metotlarınız da deferred çalışır; argüman doğrulaması bile ilk MoveNext'e kadar ertelenir.

  1. .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.ZorC# & .NETBackend
  2. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  3. IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?KolayC# & .NETBackend
  4. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  5. ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?OrtaC# & .NETBackend
  6. ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle