Sobes.tech
Middle

Kas ir IQueryable C# kontekstā?

sobes.tech AI

Atbilde no AI

IQueryable<T> ir LINQ interfeiss, kas ļauj veidot un izpildīt vaicājumus uz datu avotu, kas atbalsta vilkšanas novērtējumu un iespēju veidot izteiksmju kokus.

Galvenās iezīmes:

  • Vilkšanas novērtējums: Vaicājums netiek izpildīts uzreiz tā veidošanas laikā, bet tikai tad, kad ir nepieciešami rezultāti (piemēram, iterējot pār kolekciju vai izsaucot ToList(), ToArray()).
  • Izteiksmju koks: Vaicājums ir attēlots kā izteiksmju koks (Expression<Func<T>>), kuru var analizēt un pārveidot par kaut ko, kas ir saprotams datu avotam (piemēram, SQL vaicājums datu bāzei).
  • Filtrēšana un projekcija datu avota pusē: Pateicoties izteiksmju kokam, filtrēšanas (Where), kārtošanas (OrderBy) un projekcijas (Select) operācijas var tikt veiktas datu avota pusē, kas ievērojami palielina veiktspēju, īpaši strādājot ar lieliem datu apjomiem.

Atšķirības no IEnumerable<T>:

Raksturlielums IEnumerable<T> IQueryable<T>
Novērtējums Nekavējošs/Novēlots (atkarīgs no avota) Vilkšanas novērtējums
Datu iegūšana Visa kolekcija var tikt ielādēta atmiņā Tiek ielādēti tikai nepieciešamie dati pēc izpildes
Kur notiek filtrēšana/projekcija Atmiņā aplikācijā Pusē datu avotā
Pamats Kolekcijas atmiņā, masīvi Datu avoti (datu bāzes, tīmekļa pakalpojumi u.c.)
Izteiksmju atbalsts Nē (izmanto delegātus Func<T>) Jā (izmanto izteiksmju kokus Expression<Func<T>>)

Piemērs izmantošanai:

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

// Iedomāsimies, ka tas ir datu avots, kas atbalsta 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()
    {
        // Reālajā situācijā šeit būtu piekļuve datu bāzei vai citam avotam
        return people.AsQueryable();
    }
}

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

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

        // Izveido vaicājumu ar IQueryable - vaicājums vēl nav izpildīts
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Vaicājuma izpilde iterējot
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Vaicājuma izpilde, pārvēršot to par sarakstu
        List<Person> seniors = query.ToList();
    }
}