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