Entity Framework Extensions Update from Query

Definition

UPDATE all rows from the database using a LINQ Query without loading entities in the context.

An UPDATE statement is built using the LINQ expression and directly executed in the database.

// UPDATE all customers that are inactive for more than two years
var date = DateTime.Now.AddYears(-2);
context.Customers
    .Where(x => x.IsActive && x.LastLogin < date)
    .UpdateFromQuery(x => new Customer {IsActive = false});
	
// UPDATE customers by id
context.Customers.Where(x => x.ID == userId).UpdateFromQuery(x => new Customer {IsActive = false});

Try it in EF Core | Try it in EF6

Purpose

Updating entities using SaveChanges normally requires loading them first in the ChangeTracker. These additional round-trips are often not necessary.

UpdateFromQuery gives you access to directly execute an UPDATE statement in the database and provide a HUGE performance improvement.

Performance Comparisons

Operations 1,000 Entities 2,000 Entities 5,000 Entities
SaveChanges 1,000 ms 2,000 ms 5,000 ms
UpdateFromQuery 1 ms 1 ms 1 ms
## FAQ

Why UpdateFromQuery is faster than SaveChanges, BulkSaveChanges, and BulkUpdate?

UpdateFromQuery executes a statement directly in SQL such as UPDATE [TableName] SET [SetColumnsAndValues] WHERE [Key].

Other operations normally require one or multiple database round-trips which makes the performance slower.

Limitation

EF Core & Client Evaluation

UpdateFromQuery use the SQL generated by EF Core. When a filter is made on client-side, it means the filtering happens in the application and not in the SQL executed.

In other words, even if you put a filter, all rows tables could be potentially updated if the filter is made on the client-side.

We always recommend to disable the client evaluation to avoid performance issues in your application.


Last updated: 2023-03-01
Author:


Contents