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"); // Ֆիլտրումը տեղի է ունենում հիշողության մեջ