Verwijderen van reeksen in Entity Framework
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.