Sobes.tech
Middle

C# bağlamında IQueryable nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

IQueryable<T> LINQ içinde, tembel değerlendirmeyi ve ifade ağacı oluşturma yeteneğini destekleyen veri kaynağına sorgular oluşturmayı ve çalıştırmayı sağlayan bir arayüzdür.

Ana özellikler:

  • Tembel değerlendirme: Sorgu, oluşturulduğu anda hemen çalıştırılmaz, yalnızca sonuçlar gerektiğinde (örneğin, koleksiyon üzerinde yineleme yaparken veya ToList(), ToArray() çağrıldığında) çalıştırılır.
  • İfade ağacı: Sorgu, bir ifade ağacı (Expression<Func<T>>) şeklinde temsil edilir, bu da analiz edilip veri kaynağı için anlaşılır bir şeye dönüştürülebilir (örneğin, bir veritabanı için SQL sorgusu).
  • Veri kaynağında filtreleme ve projeksiyon: İfade ağacı sayesinde, filtreleme (Where), sıralama (OrderBy) ve projeksiyon (Select) işlemleri veri kaynağında gerçekleştirilebilir, bu da performansı önemli ölçüde artırır, özellikle büyük veri hacimleriyle çalışırken.

IEnumerable<T> ile farkları:

Özellik IEnumerable<T> IQueryable<T>
Değerlendirme Anında/Erteleme (kaynaklara bağlı) Tembel
Veri alma Tüm koleksiyon belleğe yüklenebilir Sadece gerekli veriler çalıştırmadan sonra yüklenir
Filtreleme/projeksiyon nerede yapılır Uygulama belleğinde Veri kaynağında
Temel Bellekteki koleksiyonlar, diziler Veri kaynakları (veritabanları, web servisleri vb.)
İfade desteği Hayır (delegeler Func<T> kullanır) Evet (ağacı ifadeleri Expression<Func<T>> kullanır)

Kullanım örneği:

using System.Linq;
using System.Collections.Generic;

// Bu, IQueryable destekleyen bir veri kaynağı varsayalım
public class DataSource
{
    private List<Person> people = new List<Person>
    {
        new Person { Name = "Alice", Age = 30 },
        new Person { Name = "Bob", Age = 25 },
        new Person { Name = "Charlie", Age = 35 }
    };

    public IQueryable<Person> GetPeople()
    {
        // Gerçek bir durumda, bu bir veritabanı sorgusu veya başka bir kaynak olurdu
        return people.AsQueryable();
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// Kullanım
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // IQueryable ile sorgu oluşturma - sorgu henüz çalıştırılmadı
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Sorguyu yineleme sırasında çalıştırma
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Sorguyu listeye dönüştürerek çalıştırma
        List<Person> seniors = query.ToList();
    }
}