【问题标题】:LINQ: How to remove element from IQueryable<T>LINQ:如何从 IQueryable<T> 中删除元素
【发布时间】:2011-02-25 14:56:41
【问题描述】:

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

我正在寻找这样的东西

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

有可能吗?提前致谢

【问题讨论】:

    标签: c# linq iqueryable


    【解决方案1】:

    您应该能够像本文中那样进一步查询

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

    还要注意布尔函数的细微变化,它是肯定的,而不是否定的。那(否定的)就是not 运算符的用途。

    【讨论】:

    • 有这么乐观积极的功能,也可以写items.Where(IsWhatINeed)。
    • 一个函数的正版也消除了双重否定的场景:!IsNotWhatINeed()
    【解决方案2】:
    items = items.Where( x => !IsNotWhatINeed(x) );
    

    【讨论】:

    • 我想在 LINQ 中添加这一点,与所有功能代码一样,最好通过应用过滤器从旧列表中获取新列表,而不是对其进行更改。
    【解决方案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));
    

    【讨论】:

      【解决方案4】:

      其他答案是正确的,因为您可以使用“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 理解什么?谢谢!
      【解决方案5】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 2012-05-22
        • 2010-10-17
        • 2020-12-22
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        相关资源
        最近更新 更多