LINQ 中的可迭代析取

Iteratable disjunction in LINQ

假设我有一个 IQuerable 集合和一些字符串列表。

我可以这样构建查询:

foreach (var somestring in somestrings)
{
     collection = collection.Where(col=>col.Property.Contains(somestring);
}

这将产生以下 SQL 查询:

SELECT ...... FROM ..... WHERE 
(Property LIKE '%something1%') AND 
(Property LIKE '%something2%') AND 
(Property LIKE '%something3%')

请注意,WHERE 子句与 AND 连接。

有没有办法构建类似的查询,但与 OR 相关联?

您可以在一个查询中执行此操作而无需循环使用 Any:

var result = collection
    .Where(col => somestrings
        .Any(s => col.Property.Contains(s)));

或使用简化语法的相同查询:

var result = collection
    .Where(col => somestrings
        .Any(col.Property.Contains));

您可以使用 PredicateBuilder,例如 this. See SO for more

在这里您可以使用 AND 或 OR 连接查询。

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

Sample taken from C# 7.0 in a Nutshell

我在实现自定义搜索字段时成功地使用了它

例如

[red blue] -> 搜索 red AND blue

[red, blue] -> 搜索红色或蓝色