我在以下查询中获得了一个对象列表。如何删除中间的项目,说我要删除2,5和7位置的项目?感谢
var archivedPwds = from archivedPwd in db.PasswordArchive
where archivedPwd.UserId == userId
orderby archivedPwd.DateChanged
select archivedPwd;
编辑:
我正在使用L2E并希望从数据库中删除这些项目。
答案 0 :(得分:3)
您无法从IEnumerable
或IQueryable
“删除”项目。您可以做的是过滤它们,或者从过滤结果中构建另一个集合。
按索引过滤仍由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是否能够处理它。