work question
work question

Reputation: 321

How to select specific fields to update in EF

I want to get all records from a database with @where, then update them. To do this, I have created a query like this:

public async Task MarkAllAsActive()
{
    var currentUserId = _userManager.GetCurrentUserId();
    await _workOrders.Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
    {
        row.Status = WorkOrderStatus.Active;
        _uow.MarkAsChanged(row, currentUserId);
    });
}

But this query selects all fields from the database which isn't good. To solve this I try to select just specific fields like ID, Status:

public async Task MarkAllAsActive()
{
    var currentUserId = _userManager.GetCurrentUserId();
    await _workOrders.Select(row=>new WorkOrder { Id=row.Id,Status=row.Status}).Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
    {
        row.Status = WorkOrderStatus.Active;
        _uow.MarkAsChanged(row, currentUserId);
    });

}

But it return this error:

The entity or complex type 'DataLayer.Context.WorkOrder' cannot be constructed in a LINQ to Entities query.

I've seen a similar post and the same error, but my problem is different because I want to update.

How can I do this?

Upvotes: 6

Views: 936

Answers (2)

Pavvy
Pavvy

Reputation: 348

Fetching entity within same entity will not work in your case, as you are getting only selected columns. e.g. You are fetching WorkOrder entity in WorkOrder again. I would suggest you to use DTO to load selected columns only. It should work. But at the time of update you will have to copy same to db object.

Upvotes: 0

Anestis Kivranoglou
Anestis Kivranoglou

Reputation: 8164

Sadly you have to fetch the entire entity. In order to update an entity with EF, the class type edited has to be a DbContext mapped entity .

If you want to Update without fetching Entities to the server , and without writing any SQL you can use Entity Framework Extended Library .

See the update section on the site.

Upvotes: 1

Related Questions