parallax background image

Entity Framework: Queryable versus ToList

Gepubliceerd op 28 december 2021 Leestijd : 2 minuten

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.

Onze klanten
Onze oplossingen