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] -> 搜索红色或蓝色
假设我有一个 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] -> 搜索红色或蓝色