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