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