Middle
Mi az az IQueryable a C#-ban?
sobes.tech MI
Válasz az MI-től
A IQueryable<T> egy LINQ interfész, amely lehetővé teszi lekérdezések építését és végrehajtását olyan adatforrásokon, amelyek támogatják a késleltetett értékelést és az kifejezésfák építését.
Fő jellemzők:
- Késleltetett értékelés: A lekérdezés nem hajtódik végre azonnal a létrehozásakor, csak akkor, amikor az eredmények megszerzése szükséges (pl. iterálás a kollekción vagy
ToList(),ToArray()hívásakor). - Kifejezésfa: A lekérdezés kifejezésfaként (
Expression<Func<T>>) van ábrázolva, amelyet elemezni és át lehet alakítani olyan formára, amit az adatforrás értelmezni tud (pl. SQL lekérdezés adatbázishoz). - Szűrés és vetítés az adatforrás oldalán: A kifejezésfa segítségével a szűrés (
Where), rendezés (OrderBy) és vetítés (Select) műveletek végrehajthatók az adatforrás oldalán, ami jelentősen növeli a teljesítményt, különösen nagy adatmennyiség esetén.
A IEnumerable<T>-től való különbségek:
| Jellemző | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Értékelés | Azonnali/Elhalasztott (függ a forrástól) | Késleltetett |
| Adatok lekérése | Az egész kollekció betölthető a memóriába | Csak a szükséges adatok töltődnek be a végrehajtás után |
| Hol történik a szűrés/vetítés | Az alkalmazás memóriájában | Az adatforrás oldalán |
| Alapja | Memóriában lévő kollekciók, tömbök | Adatforrások (adatbázisok, webszolgáltatások stb.) |
| Kifejezés támogatás | Nem (delegáltakat Func<T> használ) |
Igen (kifejezésfákat Expression<Func<T>> használ) |
Használati példa:
using System.Linq;
using System.Collections.Generic;
// Tegyük fel, hogy ez egy adatforrás, amely támogatja az IQueryable-t
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()
{
// Valós helyzetben ez lehet adatbázis vagy más adatforrás
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Használat
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Lekérdezés létrehozása IQueryable segítségével - a lekérdezés még nem végrehajtott
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// A lekérdezés végrehajtása iteráláskor
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// A lekérdezés végrehajtása listává alakításkor
List<Person> seniors = query.ToList();
}
}