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