【发布时间】:2011-02-21 15:01:45
【问题描述】:
来自this question我5分钟前问过,很明显下面的代码抛出了异常,说明
未处理的异常: System.InvalidOperationException: 二元运算符 Equal 未定义 对于类型 'System.Nullable`1[System.Int32]' 和 'System.Int32'。
代码
public static void GetResultCollection<T>() {
AccrualTrackingEntities db = new AccrualTrackingEntities();
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, "ProcInstId"),
Expression.Constant(ItemTypeValue)),
param);
var list = result.Where(lambda).ToList();
}
但是,此代码在 Expression.Constant 中明确列出的类型确实有效
class Program {
public static void GetResultCollection<T>() {
AccrualTrackingEntities db = new AccrualTrackingEntities();
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, "ProcInstId"),
Expression.Constant(ItemTypeValue, typeof(int?))),
param);
var list = result.Where(lambda).ToList();
}
问题是,为什么 Expression.Constant 无法从 int? 隐式转换为 ... int?
【问题讨论】:
-
您可以创建自己的扩展,您可以在其中获取类型以及是否可以为空等。然后将 Expression.Constant(Object, Type) 与发现的类型一起使用
标签: c# entity-framework expression-trees