Middle
Kas ir IQueryable C# kontekstā?
sobes.tech AI
Atbilde no AI
IQueryable<T> ir LINQ interfeiss, kas ļauj veidot un izpildīt vaicājumus uz datu avotu, kas atbalsta vilkšanas novērtējumu un iespēju veidot izteiksmju kokus.
Galvenās iezīmes:
- Vilkšanas novērtējums: Vaicājums netiek izpildīts uzreiz tā veidošanas laikā, bet tikai tad, kad ir nepieciešami rezultāti (piemēram, iterējot pār kolekciju vai izsaucot
ToList(),ToArray()). - Izteiksmju koks: Vaicājums ir attēlots kā izteiksmju koks (
Expression<Func<T>>), kuru var analizēt un pārveidot par kaut ko, kas ir saprotams datu avotam (piemēram, SQL vaicājums datu bāzei). - Filtrēšana un projekcija datu avota pusē: Pateicoties izteiksmju kokam, filtrēšanas (
Where), kārtošanas (OrderBy) un projekcijas (Select) operācijas var tikt veiktas datu avota pusē, kas ievērojami palielina veiktspēju, īpaši strādājot ar lieliem datu apjomiem.
Atšķirības no IEnumerable<T>:
| Raksturlielums | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Novērtējums | Nekavējošs/Novēlots (atkarīgs no avota) | Vilkšanas novērtējums |
| Datu iegūšana | Visa kolekcija var tikt ielādēta atmiņā | Tiek ielādēti tikai nepieciešamie dati pēc izpildes |
| Kur notiek filtrēšana/projekcija | Atmiņā aplikācijā | Pusē datu avotā |
| Pamats | Kolekcijas atmiņā, masīvi | Datu avoti (datu bāzes, tīmekļa pakalpojumi u.c.) |
| Izteiksmju atbalsts | Nē (izmanto delegātus Func<T>) |
Jā (izmanto izteiksmju kokus Expression<Func<T>>) |
Piemērs izmantošanai:
using System.Linq;
using System.Collections.Generic;
// Iedomāsimies, ka tas ir datu avots, kas atbalsta 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()
{
// Reālajā situācijā šeit būtu piekļuve datu bāzei vai citam avotam
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Izmantošana
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Izveido vaicājumu ar IQueryable - vaicājums vēl nav izpildīts
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Vaicājuma izpilde iterējot
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Vaicājuma izpilde, pārvēršot to par sarakstu
List<Person> seniors = query.ToList();
}
}