如何以编程方式在Where()子句(.Where(fn)或.Where(fn)或.Where(fn))之间创建带/或的单个LINQ查询

如何以编程方式在Where()子句(.Where(fn)或.Where(fn)或.Where(fn))之间创建带/或的单个LINQ查询,linq,entity-framework,Linq,Entity Framework,我想知道,是否可以使用N.Where()子句,但在这些.Where()子句之间,以编程方式创建单个LINQ查询(针对EntityFramework 6) 想象一下IQueryable对象的定义如下: var query = dbContext.MyTable.Where(mt => mt.TimeStamp >= DateBegin); 我还需要添加N(未知数量)的Where子句,但它们之间有OR条件 某些对象的图像列表: List<MyObject> myObj =

我想知道,是否可以使用N
.Where()
子句,但在这些
.Where()
子句之间,以编程方式创建单个LINQ查询(针对EntityFramework 6)

想象一下IQueryable对象的定义如下:

var query = dbContext.MyTable.Where(mt => mt.TimeStamp >= DateBegin);
我还需要添加N(未知数量)的Where子句,但它们之间有OR条件

某些对象的图像列表:

List<MyObject> myObj = 
  new List<MyObject>({new MyObject {val = "a" }, new MyObject { val = "b"}}); //In real code there is more than 1 property.
我曾经考虑过
.Union()
beteen查询,但是它可以在分离的查询之间生成Union,我认为这不是最优的

谢谢

以下是解决方案:

或课程必须使用“最新”答案:

复制/粘贴
类参数reBinder

复制/粘贴
静态类实用程序

用法:

Expression<Func<Car, bool>> theCarIsRed = c => c.Color == "Red";
Expression<Func<Car, bool>> theCarIsCheap = c => c.Price < 10.0;
Expression<Func<Car, bool>> theCarIsRedOrCheap = theCarIsRed.Or(theCarIsCheap);
var query = carQuery.Where(theCarIsRedOrCheap);
以下是解决方案:

或课程必须使用“最新”答案:

复制/粘贴
类参数reBinder

复制/粘贴
静态类实用程序

用法:

Expression<Func<Car, bool>> theCarIsRed = c => c.Color == "Red";
Expression<Func<Car, bool>> theCarIsCheap = c => c.Price < 10.0;
Expression<Func<Car, bool>> theCarIsRedOrCheap = theCarIsRed.Or(theCarIsCheap);
var query = carQuery.Where(theCarIsRedOrCheap);

不确定你到底想做什么,但你能用contains吗?如果要检查MyValue是否是列表中的值之一?是否需要仅按一个属性(例如
q.MyValue
)或多个属性(例如
)进行筛选,其中(q=>q.MyValue1==value1 | | q.MyValue2==value2)
?在这种情况下,您需要将每个属性比较构建到一个单独的
表达式
实例,然后将它们组合起来。看一看这篇文章:如果您的场景需要更多的代码示例,请告诉我这不是一个
Union()
,它只是创建了与
相同的表达式(因此也是相同的SQL),其中(q=>q.MyVal1==val1 | | q.MyVal2==val2 | | |)
。这将导致一个SQL查询,其中包含一组由
分隔的子句?如果要检查MyValue是否是列表中的值之一?是否需要仅按一个属性(例如
q.MyValue
)或多个属性(例如
)进行筛选,其中(q=>q.MyValue1==value1 | | q.MyValue2==value2)
?在这种情况下,您需要将每个属性比较构建到一个单独的
表达式
实例,然后将它们组合起来。看一看这篇文章:如果您的场景需要更多的代码示例,请告诉我这不是一个
Union()
,它只是创建了与
相同的表达式(因此也是相同的SQL),其中(q=>q.MyVal1==val1 | | q.MyVal2==val2 | | |)
。这将导致一个SQL查询,其中包含由
分隔的一组子句。您可以使用PredicateBuilder:
var firstExpression = expressionList.First();
expressionList.Skip(1).ToList().ForEach(ex => { firstExpression = firstExpression.Or(ex); });