【问题标题】:Expression Trees and Nullable Types表达式树和可空类型
【发布时间】:2011-02-21 14:24:55
【问题描述】:

我一直在玩表达式树。我有以下通过动态创建表达式树来执行查询的简单方法。 ItemType 在数据库中是一个可为空的 int,在 EF 实体类中也是如此。出于某种原因,尽管查询抛出了

的错误

未处理的异常: System.InvalidOperationException: 二元运算符 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 - 同样的错误

【问题讨论】:

  • 不应该是Expression.Constant(ItemTypeValue.Value)吗?
  • 好主意,但不,同样的错误

标签: c# entity-framework expression-trees


【解决方案1】:

我认为你需要转换它

var right = Expression.Constant(ItemTypeValue , typeof(int?))
....

 var lambda = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(
                Expression.Property(param, "ItemType"),
                right),
            param);

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多