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