我有一个场景需要使用LINQ构建SQL查询,其中包含可变数量的OR子句。我正在编写一个基于某些输入构建查询的函数。函数定义类似于......
function BuildQuery(ICollection<ColumnsThatNeedToBeTrue> columns)
{
...
}
所以,我给出了一系列我需要检查的列,并且检查需要使用OR
子句。
如果columns
数组包含A
和B
,我需要查询来检查列A
是否为真或列B
是的。
如果columns
数组包含A
,B
和C
,我需要查询并检查A
或{{1}或B
是真的。
我不知道如何在一个C
内完成所有操作,因为我不知道如何逐步增加Where
条款。我不确定我是如何根据输入数组在下面添加额外的OR检查。
||
我无法链接var query = entities.Where(m => m.A == true || m.B == true ...)
个函数,每个函数用于自己的列检查,因为它使用Where
子句构建该查询,我需要AND
。
有没有办法使用LINQ构建这样的查询?
答案 0 :(得分:6)
您可以使用PredicateBuilder链接or
条件。
var predicate = PredicateBuilder.False<SomeEntity>();
predicate = predicate.Or (p => p.A == true);
if(something)
predicate = predicate.Or (p => p.B == true);
var query = entities.AsExpandable().Where (predicate); //AsExpandable() for EF
答案 1 :(得分:-1)
Linq使用不同的执行,因此查询可以相互构建,并且在访问数据之前不会执行。
以下是如何使用简化示例构建查询的方法,该示例可以根据需要键入外部条件以创建两个特定的where子句。
var myData = TheData.Where( itm => itm.Value == true);
if ({some condition})
myData = myData.Where(itm => itm.Other == true);
else
myData = myData.Where(itm => itm.SomethingElse == false);
var result = myData.ToList();
最终结果只有where
中的一个if
子句,并且在运行时动态运行。