比方说,我们需要申请几个条件,从一个名为表中选择“东西”(未知数量和性质)
如果条件是已知的,我们可以写
db.Things.Where(t=>foo1 && foo2 || foo3);
但是,如果我们要建立一个Where条件编程,我能想象我们如何能申请条件相与
IQuerable DesiredThings = db.Things.AsQuerable();
foreach (Condition c in AndedConditions)
DesiredThings = DesiredThings.Where(t => GenerateCondition(c,t));
什么逻辑或条件? 注意:我们不希望进行联合,独特,或任何其他昂贵的操作,它希望因为如果我们把它写广告典当查询生成
提前致谢。
加成:
PredicateBuilder:动态撰写表达谓词
你可以使用静态方法表达类来实现它的运行时间。
下面的代码被彪创建委托服用称为int类型的值一个参数。 它从BUTTOM读取到顶部,这样,行的问题是:
var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
该方法的主体中的参数的值进行比较,以调用类型FOO的新创建的对象的方法酒吧
var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
然后创建一个类似的表达,或者是他们
var orExp = Expression.OrElse(exp1, exp2);
最后一件事是编译调用。 该调用生成可以在何处方法调用中使用的委托。
希望它可以帮助寿林的表情不知道100%,从参数中获得的价值
var exp1 = Expression.Equal(Expression.Parameter(typeof(int),"value"), Expression.Property(Expression.New(typeof(Bar).GetConstructor(new Type[] { })), "Foo"));
var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
var orExp = Expression.OrElse(exp1, exp2);
var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
method.Compile();
你可能会想看看援引invokation代替编译表达式,如果你需要的LambdaExpression被翻译成非二进制代码不同的东西(例如,进入一个SQL语句)
对于OR
,你有两个选择:
- 使用
Union
/ Concat
- 写
Expression
代码
第二个是更接近.Where(x => {a} || {b})
如果你正在使用LINQ到SQL,您可以使用Expression.Invoke
多个独立的lambda表达式结合( 见这个答案 ) -但是,这不是在实体框架的支持。 在EF,你必须建立整个表达式为单个块,使用Expression.OrElse
; 例如在这里或在这里 。