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