Sobes.tech
Middle

Ինչպես որոշել, երբ պետք է օգտագործել IQueryable փոխարեն IEnumerable- ի կոդում?

sobes.tech AI

Պատասխան AI-ից

Օգտագործեք IQueryable, երբ անհրաժեշտ է կատարել բարդ հարցումներ տվյալների աղբյուրի (օրինակ՝ տվյալների բազայի) հետ հետաձգված կատարմամբ: Սա թույլ է տալիս IQueryable մատակարարին թարգմանել LINQ արտահայտությունները համապատասխան հարցման լեզվին (օրինակ՝ SQL), օպտիմալացնելով տվյալների ընտրությունը:

Օգտագործեք IEnumerable, երբ տվյալների աղբյուրը արդեն հիշողության մեջ է կամ երբ հարցումը կատարվում է տեղական մակարդակում (օրինակ՝ օբյեկտների ցանկը ֆիլտրելիս): IEnumerable աշխատում է հիշողության մեջ գտնվող օբյեկտների հավաքածուի հետ:

Հիմնական տարբերությունները՝

Գծանշան IEnumerable IQueryable
Որտե՞ղ է կատարվում հարցումը Հաճախորդի հիշողության մեջ: Տվյալների աղբյուրի կողմում:
Արդյունավետություն Ավելի քիչ արդյունավետ մեծ տվյալների հավաքածուների համար, քանի որ նախ վերցվում է ամբողջ հավաքածուն, ապա ֆիլտրում է հիշողության մեջ: Ավելի արդյունավետ մեծ տվյալների հավաքածուների համար, քանի որ հարցումը օպտիմալացվում է և կատարվում է տվյալների աղբյուրի կողմում, միայն անհրաժեշտ տվյալները բերվում են:
Հնարավորություններ Աջակցում է LINQ to Objects-ին: Աջակցում է LINQ to SQL/Entities և այլ IQueryable մատակարարներին:
Հետաձգված կատարման Կան, բայց տվյալների մշակումը տեղի է ունենում հիշողության մեջ: Կան, հարցման մատակարարը կառուցում է արտահայտությունների ծառը և executes the query on the data source.

Օրինակ՝ IQueryable օգտագործումը Entity Framework Core-ի հետ:

// Նշենք, որ context-ը՝ DbContext-է Entity Framework
var query = context.Products
                   .Where(p => p.Price > 100)
                   .OrderBy(p => p.Name)
                   .Select(p => p.Name); // Հարցումը կառուցվում է, բայց չի կատարվում

// Հարցումը կատարվում է միայն երբ այն ցուցակ է վերածվում (օրինակ՝ ToList() կոչելով)
var productNames = query.ToList();

Օրինակ՝ IEnumerable օգտագործումը տվյալների ստանալուց հետո:

// Նշենք, որ products արդեն `IEnumerable<Product>` հավաքածու է հիշողության մեջ
IEnumerable<Product> products = GetProductsFromCache(); // կամ այլ գործողություն, որը վերադարձնում է տվյալները հիշողության մեջ

var filteredProducts = products.Where(p => p.Category == "Electronics"); // Ֆիլտրումը տեղի է ունենում հիշողության մեջ