Verwijderen van reeksen in Entity Framework

Geschreven door: op donderdag 23 december 2021

Leestijd: 1 minuut

Het verwijderen van entities en reeksen in Entity Framework is eenvoudig, maar er zijn wel dingen waar je op moete letten als je veel items in één keer wilt verwijderen.

Eén item verwijderen

In Entity Framework verwijder je een entity als volgt:

var itemToDelete = context.Items.First();

context.Items.Remove(itemToDelete);

context.SaveChanges();

items is hier een DbSet van het type Item. In de SQL Server Profiler, die je kan openen vanuit SQL Server Management Studio, kan je goed zien welke queries worden uitgevoerd:

Eerst:

SELECT TOP (1)

    [c].[Id] AS [Id],

    [c].[Name] AS [Name]

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

Daarna, na SaveChanges:

exec sp_executesql N'DELETE [dbo].[Item]

WHERE ([Id] = @0)',N'@0 int',@0=2

Want het item met Id 2 was de eerste in de collectie en deze wordt nu verwijderd.

Een reeks verwijderen

Als ik de eerste 1000 wil verwijderen, doe ik:

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

context.Items.RemoveRange(itemsToDelete);

context.SaveChanges();

In de SQL Server Profiler zie je:

SELECT TOP (100)

    [c].[Id] AS [Id],

    [c].[Name] AS [Name]

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

En daarna eerst:

exec sp_executesql N'DELETE [dbo].[Item]

WHERE ([Id] = @0)',N'@0 int',@0=4

En daarna:

exec sp_executesql N'DELETE [dbo].[Item]

WHERE ([Id] = @0)',N'@0 int',@0=5

En dat 100 keer.

Efficiënt een reeks verwijderen

RemoveRange zal altijd de items verwijderen _per item_. Dat kan te inefficiënt zijn en in dat geval zal je direct een query in de database moeten uitvoeren:

context.Database.ExecuteSqlCommand("DELETE [dbo].[Item] WHERE [Id] IN(SELECT TOP(5000) [Id] FROM [dbo].[Item])");

Het verschil bij het verwijderen van 5000 items?

RemoveRange: 1000 ms.

ExecuteSqlCommand: 51 ms.


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 ›