Linq,如何在查询中间删除项目返回?

时间:2010-05-11 21:02:23

标签: c# linq linq-to-entities

我在以下查询中获得了一个对象列表。如何删除中间的项目,说我要删除2,5和7位置的项目?感谢

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

编辑:

我正在使用L2E并希望从数据库中删除这些项目。

3 个答案:

答案 0 :(得分:3)

您无法从IEnumerableIQueryable“删除”项目。您可以做的是过滤它们,或者从过滤结果中构建另一个集合。

按索引过滤仍由Where:

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

答案 1 :(得分:1)

您可以使用Jon的方法仅过滤要删除的实体:

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

然后从实体集中删除它们:

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

不要忘记保存您的更改:

db.SaveChanges();

答案 2 :(得分:-1)

不幸的是,在这种情况下,你唯一的选择是循环遍历archivedPwds并“手动”删除它们(即通过调用db.PasswordArchive.DeleteOnSubmit)。

你可能会尝试使用Select方法的重载来获取项目的索引, 一世。即通过将其重写为

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

然后使用“索引”字段筛选要删除的项目。虽然,我没有在现实世界中尝试它,但我不完全确定linq2sql是否能够处理它。