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