我试图构建一个必须创建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
答案 0 :(得分:3)
所以你试图建立这样的东西:
t => loKeys.Contains(t.ID)
您唯一需要考虑的是实际Contains
是Enumerable
类中定义的静态扩展方法:
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建议的那样)。