我一直在玩表情树。我有以下简单的方法,通过动态创建表达式树来执行查询。 ItemType是数据库中的可空int,以及EF实体类。出于某种原因,虽然查询引发错误
未处理的例外情况: System.InvalidOperationException:The 二进制运算符Equal未定义 对于类型 'System.Nullable`1 [System.Int32]'和 'System.Int32'。
我不认为我要求EF转换任何东西。我的参数定义为int?
,这是我认为应该的。
注意,我看过这个
Working with nullable types in Expression Trees
但是这个家伙正试图传递他作为对象输入的可以为空的int值,我猜这个EF有问题。我实际上将此声明为正确类型 ab initio 。
public void GetResultCollection<T>() {
MyEntities db = new MyEntities();
var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));
int? ItemTypeValue = 1;
var param = Expression.Parameter(typeof(T));
var lambda = Expression.Lambda<Func<T, bool>>(
Expression.Equal(
Expression.Property(param, "ItemType"),
Expression.Constant(ItemTypeValue)),
param);
var list = result.Where(lambda).ToList();
}
修改
我也尝试了ItemTypeValue.Value
- 同样的错误
答案 0 :(得分:24)
我认为你需要转换它
var right = Expression.Constant(ItemTypeValue , typeof(int?))
....
var lambda = Expression.Lambda<Func<T, bool>>(
Expression.Equal(
Expression.Property(param, "ItemType"),
right),
param);