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