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