2014-01-06 12 views
0

我用下面的代碼來存儲的ConnectionId的列表項的列表中List<string>更新使用的ID的列表中的EntityFramework

List<string> connectionIds = 
        connectedUsers.Where(x => x.UserId == userId).Select(x => x.ConnectionId).ToList(); 

我需要更新數據庫設置連接狀態到false找到相應的ID。到目前爲止,我使用下面的代碼:

if (connectionIds.Any()) 
       { 
        foreach (string connectionId in connectionIds) 
        { 
         Connection curConn = db.Connection.FirstOrDefault(x => x.ConnectionID == connectionId); 
         if (curConn != null) 
          curConn.Connected = false; 
         db.SaveChanges(); 
        } 
       } 

然而,這使得對DB呼籲每個連接...有沒有簡單的方法來更新的過程中更容易的連接?

+0

它實際上會進行兩個調用 - 一個加載對象,一個保存更改。 – Maarten

回答

2

您可以使用Contains方法。這將導致加載連接對象的單個查詢。查詢結果後,循環查看結果以更新Connected標誌,然後保存更改。

List<string> connectionIds = ...; 

if (connectionIds.Any()) { 
    var data = db.Connection 
     .Where(x => connectionIds.Contains(x.ConnectionID)) 
     .ToList(); 
    foreach (var item in data) { 
     item.Connected = false; 
    } 
    db.SaveChanges(); 
} 
+0

完美!謝謝:) – TheGeekZn

+0

請注意,這個列表是使用參數給予'SQL'的,並且查詢的參數數量最大(我想2000年左右),所以如果你期望更多的連接ID,那麼這個解決方案不管用。 – Maarten

+0

請參閱http://stackoverflow.com/a/845972/261050 – Maarten

0

您想在一個帶有EF的SQL語句中執行批量更新。 EF不直接支持這一點。有關可能的解決方案,請參見here