【问题标题】:Or() expression in linq [duplicate]linq中的Or()表达式[重复]
【发布时间】:2014-11-15 09:32:00
【问题描述】:

这是我的方法:

public static IEnumerable<Answer> FilterByKeyValue(this IEnumerable<Answer> query, KeyFilterModel[] filters)
{
   if (filters != null && filters.Length > 0)
   {
      foreach (var filter in filters)
      {
         foreach (var value in filter.FilterValues)
           query = query.Where(f => f.RespondentEntryID.HasValue && f.RespondentEntry.Values.Any(g => g.Key.Name.Contains(filter.Key) && g.Values.Contains(value)));
      }

    }
    return query;
}

对于我的迭代中的每个项目,我都有一个 query.Where( ... ),这是一个 AND ...,但我想在 OR 函数中使用它。

谁能帮帮我?

【问题讨论】:

  • 在 or 函数中是什么意思?怎么说你的函数是and函数?
  • 我认为我没有真正理解您的查询,但如果您需要编程或然后使用 ||代替 &&,无论您需要什么,您也可能希望将或 (||) 组合在一起,然后将 && 应用于该组,反之亦然
  • @KenpachiZaraki:组合 Where 的行为类似于“and”,即Where(cond1).Where(cond2) 等价于Where(cond1 &amp;&amp; cond2)。 OP 最有可能在寻找 Where(cond1 || cond2)
  • 同意 Magnus 的观点,尤其是关于其链接的公认答案:使用 PredicateBuilder,它很简单而且效果很好。使用外部库(不是 LINQ 本机功能)只是有一个小缺点

标签: c# linq expression


【解决方案1】:

重申问题:您当前正在返回满足所有过滤器的答案,并且您希望返回满足任何过滤器的答案。

下面是执行此操作的代码:

public static IEnumerable<Answer> FilterByKeyValue(this IEnumerable<Answer> query, KeyFilterModel[] filters)
{
    if (filters != null && filters.Length > 0)
    {
        query = query.Where(a => PassesAnyFilter(a, filters));
    }
    return query;
}

private static bool PassesAnyFilter(Answer answer, KeyFilterModel[] filters)
{
    foreach (var filter in filters)
        foreach (var value in filter.FilterValues)
        {
            if (answer.RespondentEntryID.HasValue && answer.RespondentEntry.Values.Any(g => g.Key.Name.Contains(filter.Key) && g.Values.Contains(value)))
            return true;
        }

    return false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多