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