LINQ中的可迭代析取

时间:2019-05-28 08:09:51

标签: c# .net linq lambda linq-to-sql

假设我有一个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相关联?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

您可以使用this之类的PredicateBuilder。请参见SO 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

在实现自定义搜索字段时,我已经成功使用了

例如

[红色蓝色]->搜索红色和蓝色

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