Sobes.tech
Middle

რა არის IQueryable C# კონტექსტში?

sobes.tech AI

პასუხი AI-სგან

IQueryable<T> LINQ-ში ინტერფეისია, რომელიც საშუალებას აძლევს შექმნას და შეასრულოს სარეკლამო მოთხოვნები მონაცემთა წყაროებზე, რომლებიც მხარს უჭერენ მავნე შეფასებას და გამოხატულების ხის მშენებლობას.

ძირითადი მახასიათებლები:

  • მავნე შეფასება: მოთხოვნა არ ხორციელდება დაუყოვნებლივ მისი შექმნის დროს, არამედ მხოლოდ მაშინ, როდესაც საჭიროა შედეგების მიღება (მაგალითად, კოლექციაზე გადავლით ან ToList(), ToArray()-ის გამოძახებით).
  • გამოხატულების ხე: მოთხოვნა წარმოდგენილია როგორც გამოხატულების ხე (Expression<Func<T>>), რომელიც შეიძლება ანალიზდეს და გარდაიქმნას ისეთზე, რასაც მონაცემთა წყარო ხვდება (მაგალითად, SQL მოთხოვნა მონაცემთა ბაზისთვის).
  • ფილტრაცია და პროექცია მონაცემთა წყაროს მხარეს: გამოხატულების ხის დახმარებით, ფილტრაციის (Where), სორტირების (OrderBy) და პროექციის (Select) ოპერაციები შეიძლება შესრულდეს მონაცემთა წყაროს მხარეს, რაც მნიშვნელოვნად ზრდის შესრულების სიჩქარეს, განსაკუთრებით დიდი მონაცემების სამუშაოს დროს.

განსხვავებები IEnumerable<T>-თან:

მახასიათებელი IEnumerable<T> IQueryable<T>
შეფასება დაუყოვნებლივი/გადადებული (მიმდინარეობს წყაროზე) მავნე შეფასება
მონაცემების მოპოვება მთელი კოლექცია შეიძლება ჩაიტვირთოს მეხსიერებაში მხოლოდ საჭირო მონაცემები იტვირთება შესრულების შემდეგ
სად ხორციელდება ფილტრაცია/პროექცია პროგრამის მეხსიერებაში მონაცემთა წყაროს მხარეს
საფუძველი მეხსიერებაში კოლექციები, მასივები მონაცემთა წყაროები (ბაზები, ვებ სერვისები და ა.შ.)
გამოხატულების მხარდაჭერა არა (Func<T> დელეგატების გამოყენება) დიახ (Expression<Func<T>> გამოხატულების ხე)

გამოყენების მაგალითი:

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

// განვიხილოთ, რომ ეს მონაცემთა წყაროა, რომელიც მხარს უჭერს 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()
    {
        // რეალურად, ეს შეიძლება იყოს ბაზის ან სხვა წყაროს გამოძახება
        return people.AsQueryable();
    }
}

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

// გამოყენება
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // მოთხოვნის შექმნა IQueryable-ით - მოთხოვნა ჯერ არ შესრულებულა
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // მოთხოვნის შესრულება იტერაციით
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // მოთხოვნის შესრულება სიად გარდაქმნით
        List<Person> seniors = query.ToList();
    }
}