Middle
Ի՞նչ է IQueryable-ը C# կոնտեքստում։
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();
}
}