如何使用LINQ链接OR子句?

时间:2016-03-23 18:33:32

标签: c# linq

我有一个场景需要使用LINQ构建SQL查询,其中包含可变数量的OR子句。我正在编写一个基于某些输入构建查询的函数。函数定义类似于......

function BuildQuery(ICollection<ColumnsThatNeedToBeTrue> columns)
{
  ...
}

所以,我给出了一系列我需要检查的列,并且检查需要使用OR子句。

如果columns数组包含AB,我需要查询来检查列A是否为真或列B是的。

如果columns数组包含ABC,我需要查询并检查A或{{1}或B是真的。

我不知道如何在一个C内完成所有操作,因为我不知道如何逐步增加Where条款。我不确定我是如何根据输入数组在下面添加额外的OR检查。

||

我无法链接var query = entities.Where(m => m.A == true || m.B == true ...) 个函数,每个函数用于自己的列检查,因为它使用Where子句构建该查询,我需要AND

有没有办法使用LINQ构建这样的查询?

2 个答案:

答案 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子句,并且在运行时动态运行。