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

时间:2013-11-28 08:59:53

标签: linq entity-framework

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

想象一下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.

然后我想添加Where()子句来查询:

myObj.ForEach(mo =>{
   // THIS CREATES -AND- BETWEEN WHERE CLAUSES, BUT I NEED -OR-
   query.Where(q=>q.MyValue == mo.val); // In real code there is more than 1 property to compare
});

我在考虑查询之间的.Union(),但它可以在分离的查询之间生成联合,而且我认为这不是最优的。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是解决方案:linq-to-entities-combining-predicates

或者当然需要使用“最新”答案:

复制/粘贴class ParameterRebinder

复制/粘贴static class Utility

用法:

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);

因为在我的解决方案中有N个表达式,我先取表达式,然后在ForEach循环中附加其他表达式。

var firstExpression = expressionList.First();
expressionList.Skip(1).ToList().ForEach(ex => { firstExpression = firstExpression.Or(ex); });