2017-02-06 71 views
6

我想用@where從數據庫中獲取所有記錄,然後更新它們。要做到這一點,我創建了一個這樣的查詢:如何在EF中選擇要更新的特定字段

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); 
    }); 
} 

但該查詢將從這是不好的數據庫中選擇所有字段。爲了解決這個問題我儘量選擇像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); 
    }); 

} 

但這個錯誤:

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

我已經看到了類似的帖子,並同樣的錯誤,但我的問題是不同的,因爲我想更新。

我該怎麼做?

+0

嘗試'。選擇(行=>新{ID = row.Id,狀態= row.Status})',LINQ到實體允許使用匿名類型的突起。在我看來,你應該首先使用'Where'選擇需要的項目,使用'Select'。 –

+0

@M.Wiśnicki有個問題。狀態是一個枚舉,現在我不能設置枚舉狀態,它說不能分配給 - 。因爲它的anynoumos類型 –

+0

也添加'_uow.MarkAsChanged()'。我認爲你嘗試更新不正確的方式。 –

回答

1

很遺憾,您必須獲取整個實體。 爲了使用EF更新實體,編輯的類類型必須是DbContext映射的實體。

如果你想更新並不獲取實體到服務器,並無需編寫你可以使用任何Entity Framework Extended Library SQL。

在網站上看到的更新部分。同一實體內

0

抓取實體不會在你的情況下工作,因爲你得到只是選定列。例如您再次在WorkOrder中獲取WorkOrder實體。 我建議你使用DTO來只加載選定的列。它應該工作。但在更新時,您將不得不將其複製到db對象。

相關問題