【问题标题】:Filter IEnumerable<T> against IEnumerable<string>针对 IEnumerable<string> 过滤 IEnumerable<T>
【发布时间】:2014-07-16 14:21:21
【问题描述】:

我有一个对象Style,其属性为StockNumber。我想根据用户在搜索中输入的IEnumerable&lt;string&gt; stockNumbers 过滤所有Db.Styles 的列表。 DB.StylesIEnumerable&lt;Style&gt;。这基本上是我想要做的:

public IEnumerable<Style> LoadListOfStyles(IEnumerable<string> stockNumbers)
{
    return Db.Styles.Intersect(stockNumbers);
    // Need to filter Db.Styles based on stockNumbers
}

那么有没有一种简单的方法可以将Db.Styles 中的所有样式列表与我在stockNumbers 中的搜索值进行比较,以返回仅包含用户搜索过的Styles 的过滤列表?我看到能够做到这一点的唯一方法是让 2 个 IEnumerable 对象相交,但是从搜索的股票编号中一一加载样式似乎是很多不必要的代码。我想知道是否有更简单的方法。还是我需要滚动自己的方法来过滤结果?

【问题讨论】:

    标签: c# linq entity-framework lambda


    【解决方案1】:
    return db.Styles.Where(style => stockNumbers.Any(sn => sn == style.StockNumber));
    

    【讨论】:

    • 谢谢!这正是我所想的,但我只是不知道确切的语法。只要网站允许,我就会接受这个答案。
    【解决方案2】:
    public IEnumerable<Style> LoadListOfStyles(List<string> stockNumbers)
    {
        return db.Styles.Where(s => stockNumbers.Contains(s.StockNumber));
    }
    

    【讨论】:

      【解决方案3】:

      考虑一个Where 子句。

      public IEnumerable<Style> LoadListOfStyles(IEnumerable<string> stockNumbers)
      {
          return Db.Styles.Where(style => !stockNumbers.Contains(style.StockNumber));
      }
      

      【讨论】:

        【解决方案4】:

        您可以将Intersect 视为有效的Join,其中每个对象的键始终是“它们自己”。在这里,您要执行键并不总是“本身”的连接,因此您使用 Join(或者,如果您需要删除重复项,则使用 GroupJoin)。

        var query = from style in Db.Styles
            join number in stockNumbers
            on style.StockNumber equals number
            into numbers
            where numbers.Any()
            select style;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-17
          • 2018-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 1970-01-01
          相关资源
          最近更新 更多