Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity framework update one column by increasing the current value by one without select

What I want to achieve is the simple sql query: UPDATE TABLE SET COLUMN = COLUMN + 1

Is there a way to make it happen without loading all records (thousands) to memory first and loop through each record to increment the column and then save it back?

EDIT

I tried raw sql and it worked. I have to decide the sql provider from the connection string and the database schema name from the connection context. After that, I will use the corresponding sql query to update the table.

For SQL, it looks like UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1. for POSTGRESQL, I have to double quote schema name, table name and column name: UPDATE "schemaname"."TABLE" SET "COLUMN" = "COLUMN" + 1.

like image 850
ydou Avatar asked Jun 03 '15 00:06

ydou


People also ask

How do I change the value of a specific column?

We have to use the SET keyword in the UPDATE command for modifying the value of the columns. WHERE clause specifies which row you want to change.

How do you UPDATE one column with another column data?

In such a case, you can use the following UPDATE statement syntax to update column from one table, based on value of another table. UPDATE first_table, second_table SET first_table. column1 = second_table. column2 WHERE first_table.id = second_table.

How do you UPDATE a specific record in an existing table?

The UPDATE command in SQL is used to modify or change the existing records in a table. If we want to update a particular value, we use the WHERE clause along with the UPDATE clause. If you do not use the WHERE clause, all the rows will be affected.


2 Answers

Here is the solution. You can use the following code:

context.Table.Where(x => x.Field1 > 0).Update(y => new Table { Field2 = y.Field2 + 1 });

hope that it helps.

like image 68
Varan Sinayee Avatar answered Oct 22 '22 21:10

Varan Sinayee


With pure EF, you are right: you have to load the entities one by one, set the property, and save. Very inefficient.

The 2 alternatives that I know of are:

  1. Provide raw SQL to execute the UPDATE statement as you want it.
  2. Use the EntityFramework.Extended library (https://github.com/loresoft/EntityFramework.Extended), which supports both bulk UPDATEs and DELETEs with a natural EF feel.

Quote from their main page:

Batch Update and Delete

A current limitations of the Entity Framework is that in order to update or delete an entity you have to first retrieve it into memory. Now in most scenarios this is just fine. There are however some senerios where performance would suffer. Also, for single deletes, the object must be retrieved before it can be deleted requiring two calls to the database. Batch update and delete eliminates the need to retrieve and load an entity before modifying it.

Deleting

//delete all users where FirstName matches
context.Users.Where(u => u.FirstName == "firstname").Delete();

Update

//update all tasks with status of 1 to status of 2
context.Tasks.Update(
    t => t.StatusId == 1, 
    t2 => new Task {StatusId = 2});

//example of using an IQueryable as the filter for the update
var users = context.Users.Where(u => u.FirstName == "firstname");
context.Users.Update(users, u => new User {FirstName = "newfirstname"});
like image 33
sstan Avatar answered Oct 22 '22 21:10

sstan