Sobes.tech
Middle

C# контекстинде IQueryable эмне?

sobes.tech AI

AIден жооп

IQueryable<T> LINQ ичинде интерфейс болуп саналат, ал ленивую баалоо жана билдирүү дарагын курууга мүмкүндүк берген булактарда суроо-талаптарды түзүүгө жана аткарууга мүмкүндүк берет.

Негизги өзгөчөлүктөр:

  • Ленивое баалоо: Суроо-талап түзүлгөндө дароо аткарылбайт, ал гана керек болгондо (мисалы, коллекцияны кайталоо же ToList(), ToArray() чакырганда) аткарылат.
  • Билдирүү дарагы: Суроо-талап билдирүү дарагы (Expression<Func<T>>) түрүндө көрсөтүлөт, ал анализделип, булактын түшүнгөнүнө айландырылышы мүмкүн (мисалы, маалымат базасы үчүн SQL суроо-талап).
  • Фильтрлөө жана проекциялоо булактын тарапта: Билдирүү дарагынын жардамы менен, фильтрлөө (Where), сорттоо (OrderBy) жана проекциялоо (Select) операциялары булактын тарапта аткарылышы мүмкүн, бул чоң көлөмдөгү маалыматтар менен иштөөдө натыйжалуулугун жогорулатат.

IEnumerable<T> менен айырмачылыктар:

Өзгөчөлүк IEnumerable<T> IQueryable<T>
Баалоо Дароо/кечиккен (булакка көз каранды) Ленивое
Маалыматты алуу Бардык коллекция жадга жүктөлүшү мүмкүн Тек гана керектүү маалыматтар аткаргандан кийин жүктөлөт
Кайда аткарылат? Колдонмонун эсинде Буулак тарапта
Негизги Эсиндеги коллекциялар, массивдер Маалымат булактары (базалар, веб-сервистер жана башка)
Билдирүү колдоо Жок (Func<T> делегаттарын колдонуу) Ооба (Expression<Func<T>> билдирүү дарагын колдонуу)

Колдонуу мисалы:

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

// Бул маалымат булагы, IQueryable колдоосу менен иштейт деп эсептейли
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()
    {
        // Чындыкта бул базага же башка булакка кайрылуу болушу мүмкүн
        return people.AsQueryable();
    }
}

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

// Колдонуу
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // IQueryable менен суроо түзүү - суроо дагы аткарылган эмес
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Суроону аткаруу итеррация учурунда
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Суроону тизмеге айландыруу менен аткаруу
        List<Person> seniors = query.ToList();
    }
}