我正在尝试使用LINQ编写动态where子句,以返回包含字符串数组中提供的任何关键字的所有行。到目前为止,结果并没有像我预期的那样回归,看着SQL我可以看到问题。
IQueryable<comments> query = _db.comments;
if (score != null)
query = query.Where(x => x.score == score);
if (dateFrom != null)3
query = query.Where(x => x.date_created >= dateFrom);
if (dateTo != null)
query = query.Where(x => x.date_created <= dateTo);
if (keywords != null)
{
//how to use OR for each in array?
foreach (var keyword in keywords)
{
var keywordCondition = keyword;
query = query.Where(x => x.text.Contains(keywordCondition));
}
}
WHERE ([Extent1].[score] = @p__linq__0)
AND ([Extent1].[date_created] >= @p__linq__1)
AND ([Extent1].[date_created] <= @p__linq__2)
AND ([Extent1].[text] LIKE @p__linq__3 ESCAPE '~')
AND ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~')
- 应该是
WHERE ([Extent1].[score] = @p__linq__0)
AND ([Extent1].[date_created] >= @p__linq__1)
AND ([Extent1].[date_created] <= @p__linq__2)
AND (([Extent1].[text] LIKE @p__linq__3 ESCAPE '~')
OR ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~'))
我希望有人可以帮助我,因为我花了几个小时来寻找解决方案。
提前致谢
答案 0 :(得分:3)
正如您所猜测的那样,这是您需要改变的问题的一部分,因为它会&#34; AND&#34;所有条款。
//how to use OR for each in array?
foreach (var keyword in keywords)
{
var keywordCondition = keyword;
query = query.Where(x => x.text.Contains(keywordCondition));
}
我认为您可以通过将其更改为:
来实现query = query.Where(x => keywords.Any(kw => x.text.Contains(kw));
答案 1 :(得分:1)
如果您正在尝试动态构建谓词(条件),我发现这样做的最简单,最灵活的方法就是使用PredicateBuilder。
http://www.albahari.com/nutshell/predicatebuilder.aspx
它让您可以完全控制是使用and
还是or
来构建查询。
答案 2 :(得分:0)
你应该真正研究动态LINQ查询(在这里解释得非常好 - Better presentation of URLs in search results)
您可以指定您的查询,如下所示 -
.Where("Column1 = value1 OR Column2 = value2");
答案 3 :(得分:0)
我不知道是否有更清洁的方式,但改变
foreach (var keyword in keywords)
{
var keywordCondition = keyword;
query = query.Where(x => x.text.Contains(keywordCondition));
}
到
query = query.Where(x => keywords.Any(k => x.text.Contains(k));
如果Any()
包含列表中的任何关键字, x.text
将返回bool