LINQ:如何从IQueryable<T>中删除元素

16

如何遍历IQueryable并删除我不需要的元素。

我正在寻找类似于以下代码:

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId);
foreach(Item item in items)
{
  if(IsNotWhatINeed(item))
    items.Remove(item); 
}

这是可能的吗?提前致谢。

5个回答

18

你应该能够进一步查询,就像这样:

var filtered = items.Where(itm => IsWhatINeed(itm));

还要注意布尔函数从否定变成了肯定,这是not运算符的作用。


2
有了这样一个乐观和积极的功能,你还可以写items.Where(IsWhatINeed) - Kobi
1
函数的正向版本还消除了双重否定的情况:!IsNotWhatINeed() 的肯定版本为 IsWhatINeed() - Adam Naylor

10
items = items.Where( x => !IsNotWhatINeed(x) );

我想补充一下,在LINQ中,与所有函数式代码一样,最好通过应用过滤器从旧列表中获取新列表,而不是对其进行更改。 - chakrit

3
var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId 
    && !IsNotWhatINeed(x));

或者
var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId) 
    .Where(x=> !IsNotWhatINeed(x));

2

其他回答是正确的,你可以通过'where'语句进一步细化查询。然而,我假设你的查询是一个Linq2Sql查询。因此,在使用自定义函数进一步过滤数据之前,您需要确保将数据加载到内存中:

var items = MyDataContext.Items.Where(x => x.Container.ID == myContainerId)
    .ToList(); // fetch the data in memory

var itemsToRemove = items.Where(IsNotWhatINeed);

如果您真的想扩展IQueryable,那么“IsNotWhatINeed”函数必须被翻译成Linq2Sql可以理解的东西。


谢谢jeroenh,你能解释一下或者给我一个例子说明Linq2Sql查询是什么以及Linq2sql理解的是什么吗?谢谢! - Aximili

1

试试这个:

var items = YourDataContext.Items.Where(x => x.Container.ID == myContainerId 
    && !IsNotWhatYouNeed(x));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接