2010-05-11 57 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();