假设我有一个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相关联?
答案 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
在实现自定义搜索字段时,我已经成功使用了
例如
[红色蓝色]->搜索红色和蓝色
[红色,蓝色]->搜索红色或蓝色