Middle
Kas yra IQueryable C# kontekste?
sobes.tech AI
Atsakymas iš AI
IQueryable<T> yra LINQ sąsaja, leidžianti kurti ir vykdyti užklausas duomenų šaltiniuose, kurie palaiko vėlyvą įvertinimą ir išraiškų medžių konstravimą.
Pagrindinės savybės:
- Vėlyvas įvertinimas: Užklausa nėra vykdoma iš karto jos sukūrimo metu, o tik tada, kai reikia gauti rezultatus (pvz., iteruojant per kolekciją arba kviečiant
ToList(),ToArray()). - Išraiškų medis: Užklausa pateikiama kaip išraiškų medis (
Expression<Func<T>>), kurį galima analizuoti ir paversti į ką nors, ką duomenų šaltinis supranta (pvz., SQL užklausą duomenų bazei). - Filtravimas ir projekcija duomenų šaltinio pusėje: Dėl išraiškų medžio, filtravimo (
Where), rūšiavimo (OrderBy) ir projekcijos (Select) operacijos gali būti vykdomos duomenų šaltinio pusėje, kas žymiai padidina našumą, ypač dirbant su dideliais duomenų kiekiais.
Skirtumai nuo IEnumerable<T>:
| Savybė | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Vertinimas | Nedelsiant/atidėtas (priklauso nuo šaltinio) | Vėlyvas |
| Duomenų gavimas | Visa kolekcija gali būti įkelta į atmintį | Įkelia tik reikalingus duomenis po vykdymo |
| Kur vykdomas filtravimas/projekcija | Programos atmintyje | Duomenų šaltinio pusėje |
| Pagrindas | Atmintyje esančios kolekcijos, masyvai | Duomenų šaltiniai (duomenų bazės, interneto paslaugos ir kt.) |
| Išraiškų palaikymas | Ne (Func<T> delegatai) |
Taip (Expression<Func<T>> išraiškų medis) |
Pavyzdys:
using System.Linq;
using System.Collections.Generic;
// Tarkime, tai duomenų šaltinis, palaikantis 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()
{
// Iš tikrųjų tai galėtų būti užklausa į duomenų bazę ar kitą šaltinį
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Naudojimas
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Sukurti užklausą su IQueryable - užklausa dar nevykdyta
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Vykdyti užklausą iteruojant
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Vykdyti užklausą paverčiant į sąrašą
List<Person> seniors = query.ToList();
}
}