试图建立lambda树

时间:2016-03-28 06:07:07

标签: c# lambda expression-trees

我试图构建一个必须创建WHERE IN()类型查询的表达式 对于IN,我必须检查列表中是否存在值,因此我的表达式如下所示:

long loKey = 2;
List<long> loKeys = new List<long>();
loKeys.Add(loKey);

ParameterExpression parameter = Expression.Parameter(type, "t");
var constantExpression = Expression.Constant((List<long>)loKeys, typeof(List<long>));
var lambda = Expression.Lambda(
    typeof(Func<,>).MakeGenericType(type, typeof(bool)),
    Expression.Equal(
        Expression.Property(parameter, "ID"),
        constantExpression
    ),
    parameter
);
resultQuery = resultQuery.Provider.CreateQuery(
    Expression.Call(
        typeof(Queryable), 
        "Where",
        new Type[] { type },
        resultQuery.Expression,
        lambda
    ) 
);

所以我的想法是列表field ID中必须存在loKeys,但我收到错误:

  

附加信息:未定义二进制运算符Equal   类型&#39; System.Int64&#39;和&#39; System.Collections.Generic.List`1 [System.Int64]&#39;。

On Expression.Lambda - &gt; MakeGenericType

2 个答案:

答案 0 :(得分:3)

所以你试图建立这样的东西:

t => loKeys.Contains(t.ID)

您唯一需要考虑的是实际ContainsEnumerable类中定义的静态扩展方法:

var lambda = Expression.Lambda(
    Expression.Call(
        typeof(Enumerable), 
        "Contains", 
        new[] { typeof(long) },
        Expression.Constant(loKeys),
        Expression.Property(parameter, "ID")
    ),
    parameter
);

答案 1 :(得分:1)

我认为由于该部分引发异常:     Expression.Equal(     Expression.Property(参数,“ID”),     常量表达式     ) 在其中你将constantExpressions(一个通用列表)与一个long类型的参数进行比较(我猜,不是说参数是什么类型),也许你应该使用Method调用“Contains”而不是Equals。查看参数是否在列表中(如Dennis建议的那样)。