Middle
C# kontekstida IQueryable nima?
sobes.tech AI
AIdan javob
IQueryable<T> LINQ ichida kechiktirilgan baholash va ifoda daraxtini qurish imkoniyatini qo'llab-quvvatlaydigan ma'lumot manbaiga so'rovlar qurish va bajarish uchun interfeysdir.
Asosiy xususiyatlar:
- Kechiktirilgan baholash: So'rov tuzilgan vaqtda darhol bajarilmaydi, faqat natijalar kerak bo'lganda (masalan, kolleksiyada iteratsiya qilish yoki
ToList(),ToArray()chaqirishda) bajariladi. - Ifoda daraxti: So'rov ifoda daraxti (
Expression<Func<T>>) shaklida ifodalanadi, bu tahlil qilinishi va ma'lumot manbasi uchun tushunarli bo'ladigan narsaga aylantirilishi mumkin (masalan, ma'lumotlar bazasi uchun SQL so'rovi). - Ma'lumot manbasi tomonida filtratsiya va proektsiya: Ifoda daraxti yordamida, filtr operatsiyalari (
Where), tartiblash (OrderBy) va proektsiya (Select) ma'lumot manbasi tomonida bajarilishi mumkin, bu katta ma'lumotlar bilan ishlashda samaradorlikni oshiradi.
IEnumerable<T> bilan farqi:
| Xususiyat | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Baholash | Darhol/kechiktirilgan (manbaga bog'liq) | Kechiktirilgan |
| Ma'lumotlarni olish | Butun kolleksiya xotiraga yuklanishi mumkin | Faqat kerakli ma'lumotlar bajarilgandan so'ng yuklanadi |
| Filtratsiya/proektsiya qayerda bajariladi | Dastur xotirasida | Ma'lumot manbasi tomonida |
| Asosiy | Xotiradagi kolleksiyalar, massivlar | Ma'lumot manbalari (ma'lumotlar bazalari, veb-xizmatlar va boshqalar) |
| Ifoda qo'llab-quvvatlash | Yo'q (delegatlar Func<T> ishlatadi) |
Ha (ifoda daraxtlari Expression<Func<T>>) ishlatadi |
Misol:
using System.Linq;
using System.Collections.Generic;
// Bu, IQueryable ni qo'llab-quvvatlaydigan ma'lumot manbasi deb faraz qilamiz
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()
{
// Haqiqiy holatda, bu ma'lumotlar bazasiga so'rov bo'lardi yoki boshqa manba
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Foydalanish
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// IQueryable bilan so'rov yaratish - so'rov hali bajarilmagan
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// So'rovni iteratsiya qilish bilan bajarish
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// So'rovni ro'yxatga aylantirish bilan bajarish
List<Person> seniors = query.ToList();
}
}