Linq2SQL “or/and” operators (ANDed / ORed conditions)

前端 未结 2 1601
悲哀的现实
悲哀的现实 2020-12-12 01:11

Let\'s say we need to apply several conditions to select from a table called \"Things\" (unknown count and nature)

if conditions are known, we can write



        
相关标签:
2条回答
  • 2020-12-12 01:45

    You could use the Expression class with static methods to do it run time.

    The below code is ment to create a delegate taking one argument called value of type int . It reads from buttom to top so the line in question is:

    var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
    

    the body of the method compares the value of the parameter to a call to method Bar of a newly created object of type foo

    var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
    

    It then creates a similar expression and or's them

            var orExp = Expression.OrElse(exp1, exp2);
    

    final thing is the call to compile. That call generates a delegate that can be used in your where method call.

    hope it helps tho Im not 100% sure on the expression to get the value from a parameter

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

    You might wanna look at invoke for invokation instead of compiling the expression, if you need the LambdaExpression to be translated into something different than binary code (E.g. into an SQL statement)

    0 讨论(0)
  • 2020-12-12 01:46

    For OR, you have two choices:

    • use Union/Concat
    • write the Expression in code

    The second is closer to the .Where(x => {a} || {b}).

    If you are using LINQ-to-SQL, you can use Expression.Invoke to combine multiple separate lambda expressions (see this answer) - however, this isn't supported in Entity Framework. In EF, you have to build the entire expression as a single block, using Expression.OrElse; for example here or here.

    0 讨论(0)
提交回复
热议问题