Entity Framework: Queryable versus ToList header image

Entity Framework: Queryable versus ToList

dinsdag 28 december 2021 ·Leestijd: 2 minuten
contacteer auteur:

In het vorige blogitem zag je hoe je entities en reeksen kan verwijderen en hoe je dat snel kan doen als dat nodig is. In het voorbeeld haalden we alle items op met Entity Framework en maakten er een List van:

var itemsToDelete = context.Items.Take(100).ToList();
context.Items.RemoveRange(itemsToDelete);
context.SaveChanges();

Wat doet ToList? ToList voert praktisch gezien in dit voorbeeld de SQL-query uit die is opgebouwd door entity framework. Dat wil je meestal ook, maar let op dat afhankelijk van je doeleinden, je wellicht eerst de query of queries wilt verfijnen.

Een ander voorbeeld:

var items = context.Items.Take(150000).ToList();

var ids = items

          .Where(x => x.Id > 500 && x.Id % 2 == 1)

          .Select(x => x.Id).ToList();

In bovenstaand voorbeeld krijgen we een lijst van 75000 Ids van items terug, waarbij de Id oneven is. Dat duurt, volgens de debugger, in dit geval ongeveer 850 ms.

Als ik er het volgende van maak, dan heb ik exact hetzelfde resultaat, maar duurt het maar 36 ms:

var items = context.Items.Take(150000);

var ids = items

          .Where(x => x.Id > 500 && x.Id % 2 == 1)

          .Select(x => x.Id).ToList();

Waarom is dat zo? Omdat in het eerste voorbeeld ik een query opbouw en deze uitvoer, die niet alleen 150.000 items teruggeeft in plaats van 75.000, maar ook nog eens de eigenschap Name naast Id. Dit wordt daarna zowel verwerkt door de SQL-server en Entity Framework.

De SQL Server Profiler geeft:

SELECT TOP (150000)
    [c].[Id] AS [Id],
    [c].[Name] AS [Name]
    FROM [dbo].[Item] AS [c]

In het tweede voorbeeld worden de berekeningen uitgevoerd op de SQL-server zelf en geef ik alleen het nodig terug, namelijk Id:

SELECT
    [Limit1].[Id] AS [Id]
    FROM ( SELECT TOP (150000) [c].[Id] AS [Id]

        FROM [dbo].[Item] AS [c]

    )  AS [Limit1]
    WHERE ([Limit1].[Id] > 500) AND (1 = ([Limit1].[Id] % 2))

De juiste queries opbouwen en uitvoeren in Entity Framework kan ervoor zorgen dat je applicatie sneller wordt en minder geheugen nodig heeft.


Andere blogartikelen

B2B E-commerce… Wakker worden!
Geschreven door
op dinsdag 28 juni 2022
Veel B2B-bedrijven in blijven hangen in; nauwelijks vindbare, verouderde B2B e-commerce websites met minimale conversiemogelijkheden en een betreurenswaardige gebruikerservaring. Zonde!
B2B Leadgeneratie: Alles wat je altijd al wilde weten!
Geschreven door
op maandag 27 juni 2022
B2B online leadgeneratie is het proces van het identificeren van de ideale klanten voor uw product of dienst, en hen vervolgens overhalen tot aankoop. Het is een essentiële activiteit voor B2B sales- en marketingteams.
Wat maakt een B2B webshop succesvol?
Geschreven door
op zondag 26 juni 2022
De opmars van de B2B webshop neemt toe. Regelmatig krijgen wij de vraag of er een groot verschil is tussen een consumentgerichte webshop en een puur B2B gedreven webshop. In deze blog leggen wij u uit hoe een B2B webshop succesvol kan zijn en worden.
Open Nieuwsbrief Inschrijving Footer

E-book

Zo wordt uw website een lead generator 
In 3 stappen uw website van visitekaartje naar salesfunnel

Download het E-book â€º