LINQ2SQL“或/和”运算符(AND运算/ OR运算条件)(Linq2SQL “or/and”

2019-07-18 16:06发布

比方说,我们需要申请几个条件,从一个名为表中选择“东西”(未知数量和性质)

如果条件是已知的,我们可以写

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:动态撰写表达谓词

Answer 1:

你可以使用静态方法表达类来实现它的运行时间。

下面的代码被彪创建委托服用称为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语句)



Answer 2:

对于OR ,你有两个选择:

  • 使用Union / Concat
  • Expression代码

第二个是更接近.Where(x => {a} || {b})

如果你正在使用LINQ到SQL,您可以使用Expression.Invoke多个独立的lambda表达式结合( 见这个答案 ) -但是,这不是在实体框架的支持。 在EF,你必须建立整个表达式为单个块,使用Expression.OrElse ; 例如在这里或在这里 。



文章来源: Linq2SQL “or/and” operators (ANDed / ORed conditions)