Sobes.tech
Middle

Mis on IQueryable C# kontekstis?

sobes.tech AI

Vastus AI-lt

IQueryable<T> on LINQ liides, mis võimaldab koostada ja täita päringuid andmeallikale, mis toetab laisk hindamist ja avaldisepuu loomist.

Peamised omadused:

  • Laisk hindamine: Päring ei täida kohe selle koostamisel, vaid ainult siis, kui on vaja tulemusi (näiteks iteratsioonil kogumi või ToList(), ToArray() meetodi kutsumisel).
  • Avaldisepuu: Päring on kujutatud avaldisepuuna (Expression<Func<T>>), mida saab analüüsida ja muuta millekski, mis on andmeallikale arusaadav (näiteks SQL-päring andmebaasile).
  • Filtreerimine ja projektsioon andmeallika poolel: Tänu avaldisepuule saab filtreerimis- (Where), sorteerimis- (OrderBy) ja projektsioonitoimingud (Select) teostada andmeallika poolel, mis suurendab oluliselt jõudlust, eriti suurte andmemahtude korral.

Erinevused IEnumerable<T>-st:

Omadus IEnumerable<T> IQueryable<T>
Hindamine Vahetu/Viivitusega (sõltub allikast) Laisk
Andmete hankimine Kogu kogum võib laadida mällu Laaditakse ainult vajalikud andmed pärast täitmist
Kus toimub filtreerimine/projektsioon Rakenduse mälus Andmeallika poolel
Põhjus Mälukogumid, massiivid Andmeallikad (andmebaasid, veebiteenused jms)
Avaldiste tugi Ei (kasutab Func<T> delegaate) Jah (kasutab avaldisepuid Expression<Func<T>>)

Näide kasutamisest:

using System.Linq;
using System.Collections.Generic;

// Oletame, et see on andmeallikas, mis toetab 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()
    {
        // Reaalses olukorras oleks siin ühendus andmebaasi või muu allikaga
        return people.AsQueryable();
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// Kasutamine
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // Päring koos IQueryable - päring ei ole veel täidetud
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Päringu täitmine iteratsioonil
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Päringu täitmine, muutes selle nimekirjaks
        List<Person> seniors = query.ToList();
    }
}