2016-08-15 73 views
2

可以將此代碼:LINQ到實體刪除不取

using(DbContext db = new DbContext()) 
{ 
    IEnumerable<Setting> settings = db.Settings.Where(s=> s.UserId==Uid); 
    db.Settings.RemoveRange(settings); 
} 

被寫入以某種方式,就沒有必要先取出?是這樣的:

using(DbContext db = new DbContext()) 
{ 
    db.Settings.Remove(s=> s.UserId==Uid); 
} 

回答

3

你可以看看EntityFramework.Extended庫它提供你寫下面的查詢:

//delete all Settings where UserId matches 
db.Settings.Where(s=> s.UserId == Uid).Delete(); 

文檔:

實體框架的當前限制是,爲了 更新或刪除一個實體,你必須先將它檢索到內存中。 現在在大多數情況下,這很好。然而,有一些 情況下,性能會受到影響。此外,對於單次刪除, 必須先檢索該對象,然後才能刪除該對象,從而需要對數據庫調用兩次 。批量更新和刪除消除了在修改實體之前檢索和加載實體的需要。

+0

鏈接不正確。我爲EntityFramework.Extended添加了nuget packag,但我沒有看到任何刪除方法 –

+0

@AshkanMobayenKhiabani您需要添加using語句以查看擴展。我更新了鏈接以供參考。 – user3185569

+0

很棒的回答。非常感謝 –

2

當然是可以做到的:

如果UserId是主鍵:

using(DbContext db = new DbContext()) 
{ 
    Setting settingToRemove = new Setting { UserId = Uid }; 
    db.Entry(settingToRemove).State = EntityState.Deleted; 
    db.SaveChanges(); 
} 

如果UserId是不是你要查詢的數據庫,但什麼關鍵你需要的只是根據UserId獲得主鍵

using(DbContext db = new DbContext()) 
{ 
    List<int> settingIdsToRemove = db.Setting 
     .Where(m => m.UserId == Uid) 
     .Select(m => m.Id) 
     .ToList(); 

    foreach(int settingId in settingIdsToRemove) 
    { 
     Setting settingToRemove = new Setting { Id = settingId }; 
     db.Entry(settingToRemove).State = EntityState.Deleted; 
    } 

    db.SaveChanges(); 
} 
+0

怎麼能夠用於一系列的唯一途徑? –

+0

對不起,我以爲'UserId'是一個關鍵,我沒有注意IEnumerable。如果你知道PK就可以完成。你可以根據UserId獲取PK,然後在foreach循環中刪除它們。我會編輯我的答案。 –

+0

請你加入我的聊天室嗎? [chat](http://chat.stackoverflow.com/rooms/120954/azerbaycan) –