.net LINQ中的迭代析取

ttygqcqt  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(151)

假设我有一个IQueryable集合,以及一些字符串的列表。
我可以这样构建查询:

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连接?

cwtwac6a

cwtwac6a1#

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

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

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

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

p4rjhz4m2#

您可以使用this之类的 predicate 生成器。有关more,请参见SO。
您可以在此处使用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,blue] -〉搜索红色或蓝色

相关问题