Middle
Kodda IQueryable istifadə etməli olduğunuz zamanın necə müəyyən ediləcəyini necə təyin etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
IQueryable-dən istifadə edin, məlumat mənbəsinə (məsələn, verilənlər bazası) mürəkkəb sorğular etmək və gecikdirilmiş icra ilə işləmək lazım olduqda. Bu, IQueryable təminatçısına LINQ ifadələrini müvafiq sorğu dilinə (məsələn, SQL) çevirməyə və məlumatların alınmasını optimallaşdırmağa imkan verir.
IEnumerable-dən istifadə edin, məlumat mənbəsi artıq yaddaşdadırsa və ya sorğu yerli olaraq icra olunursa (məsələn, obyektlərin siyahısını filtrləmək). IEnumerable yaddaşdakı obyekt kolleksiyaları ilə işləyir.
Əsas fərqlər:
| Xüsusiyyət | IEnumerable | IQueryable |
|---|---|---|
| Sorğu harada icra olunur | Müştərinin yaddaşında. | Məlumat mənbəsinin tərəfində. |
| Performans | Böyük məlumat dəstləri üçün daha az səmərəlidir, çünki əvvəlcə bütün dəst alınır və sonra yaddaşda filtrlənir. | Böyük məlumat dəstləri üçün daha səmərəlidir, çünki sorğu optimallaşdırılır və məlumat mənbəsində icra olunur, yalnız lazım olan məlumatlar alınır. |
| İmkanlar | LINQ to Objects dəstəkləyir. | LINQ to SQL/Entities və digər IQueryable təminatçılarını dəstəkləyir. |
| Gecikdirilmiş icra | Mövcuddur, lakin məlumatların işlənməsi yaddaşda baş verir. | Mövcuddur, sorğu təminatçısi ifadə ağacı qurur və sorğunu məlumat mənbəsində icra edir. |
IQueryable ilə Entity Framework Core istifadə nümunəsi:
// Tutaq ki, context Entity Framework-in DbContext-i
var query = context.Products
.Where(p => p.Price > 100)
.OrderBy(p => p.Name)
.Select(p => p.Name); // Sorğu qurulur, lakin icra edilmir
// Sorğu yalnız siyahıya çevrildikdə icra olunur (məsələn, ToList çağırılarkən)
var məhsulAdları = query.ToList();
Məlumatlar alındıqdan sonra IEnumerable istifadə nümunəsi:
// products artıq yaddaşda olan IEnumerable<Product> kolleksiyasıdır
IEnumerable<Product> products = GetProductsFromCache(); // Və ya başqa bir əməliyyat, məlumatları yaddaşa gətirir
var filtrlənmişMəhsullar = products.Where(p => p.Category == "Electronics"); // Filtrləmə yaddaşda baş verir