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