2010-05-11 54 views
0

我收到了以下查詢中的對象列表。如何刪除中間的項目,說我想刪除2,5和7位的項目?感謝Linq,如何刪除查詢中的項目返回?

  var archivedPwds = from archivedPwd in db.PasswordArchive 
           where archivedPwd.UserId == userId 
           orderby archivedPwd.DateChanged 
           select archivedPwd; 

編輯:

我使用L2E並希望刪除數據庫中的那些項目。

+0

你是什麼意思刪除?你是否試圖向數據庫發出刪除命令? – 2010-05-11 21:15:17

+0

是的,我想從數據庫中刪除它們。 – 5YrsLaterDBA 2010-05-11 21:19:24

回答

3

您不能從IEnumerableIQueryable中刪除項目。 可以將其過濾掉,或者從過濾結果中構建另一個集合。

過濾通過指數仍然在哪裏做:

var indexesToFilterOut = new[] { 2, 5, 7 }; 
var filtered = archivedPwds.Where((pwd, i) => !indexesToFilterOut.Contains(i)); 
-1

不幸的是,在這種情況下,你唯一的選擇是通過archivedPwds在一個循環遍歷和「手動」(通過調用數據庫,即刪除它們。 PasswordArchive.DeleteOnSubmit)。

您可能會嘗試使用Select方法的過載來獲取項目的索引,即 i。即通過將其重寫爲

var archivedPwds = db.PasswordArchive 
        .Where(x => x.UserId == userId) 
        .OrderBy(x => x.DateChanged) 
        .Select((idx, item) => new { Index = idx, Item = itm }) 

然後使用索引字段過濾要刪除的項目。儘管如此,我還沒有在真實世界中嘗試過它,但我並不完全確定linq2sql是否能夠處理它。

1

您可以使用Jon的方法過濾只有實體刪除:

var pwdsToDelete = archivedPwds.Where((_, i) => (i == 3 || i == 5 || i == 7)); 

再從實體集刪除所有:

foreach (var pwd in pwdsToDelete) 
{ 
    db.PasswordArchive.DeleteObject(pwd); 
} 

不要忘記保存更改,太:

db.SaveChanges();