Middle
C# kontekstində IQueryable nədir?
sobes.tech Süni İntellekt
AI-dan cavab
IQueryable<T> LINQ-də gecikdirilmiş qiymətləndirməni və ifadə ağacını qurma qabiliyyətini dəstəkləyən məlumat mənbəsinə sorğular qurmağa və icra etməyə imkan verən interfeysdir.
Əsas xüsusiyyətlər:
- Gecikdirilmiş qiymətləndirmə: Sorğu yaradıldıqda dərhal icra edilmir, yalnız nəticələri əldə etmək lazım olduqda (məsələn, kolleksiya üzərində iterasiya zamanı və ya
ToList(),ToArray()çağırıldıqda) icra olunur. - İfade ağacı: Sorğu ifadə ağacı (
Expression<Func<T>>) şəklində təmsil olunur, bu da analiz edilə və məlumat mənbəyi üçün başa düşülən bir şeyə çevrilə bilər (məsələn, verilənlər bazası üçün SQL sorğusu). - Məlumat mənbəsinin tərəfində filtr və proyeksiya: İfade ağacı sayəsində, filtr (
Where), sıralama (OrderBy) və proyeksiya (Select) əməliyyatları məlumat mənbəsinin tərəfində həyata keçirilə bilər, bu da performansı əhəmiyyətli dərəcədə artırır, xüsusən böyük məlumat həcmləri ilə işləyərkən.
IEnumerable<T> ilə fərqlər:
| Xüsusiyyət | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Qiymətləndirmə | Dərhal/Əlavə (mənbədən asılıdır) | Gecikdirilmiş |
| Məlumatların alınması | Bütün kolleksiya yaddaşa yüklənə bilər | Yalnız lazım olan məlumatlar icra edildikdən sonra yüklənir |
| Filtr və proyeksiya harada həyata keçirilir | Tətbiq yaddaşında | Məlumat mənbəsinin tərəfində |
| Əsas | Yaddaşdakı kolleksiyalar, massivlər | Məlumat mənbələri (verilənlər bazaları, veb xidmətləri və s.) |
| İfade dəstəyi | Yox (delegatlar Func<T> istifadə edir) |
Bəli (ifadə ağacları Expression<Func<T>>) istifadə edir |
İstifadə nümunəsi:
using System.Linq;
using System.Collections.Generic;
// Bu, IQueryable dəstəkləyən məlumat mənbəsidir
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()
{
// Əsl vəziyyətdə, bu, verilənlər bazasına sorğu və ya başqa bir mənbə olardı
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// İstifadə
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// IQueryable ilə sorğu yaradılması - sorğu hələ icra olunmayıb
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Sorğunu iterasiya edərək icra etmək
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Sorğunu siyahıya çevirməklə icra etmək
List<Person> seniors = query.ToList();
}
}