【问题标题】:Error on Convert.ChangeType with Nullable<Int32>带有 Nullable<Int32> 的 Convert.ChangeType 错误
【发布时间】:2015-01-12 15:42:31
【问题描述】:

我正在为数据库查询动态构建 Lambda 表达式(使用 LINQ)。我有一个用户提供的字符串(例如“80”),我需要将它与我的数据库实体对象(例如 Car.Mileage)中的字段进行比较。当我尝试构造一个比较表达式时,我得到一个类型错误。

Car.Mileage 声明如下:

public Nullable<int> Mileage

我正在以这种方式构建我的查询:

Nullable<int> userProvided = Int32.parse(arg);
Expression constant = Expression.Constant(userProvided);
Expression property = Expression.Property(car, "Mileage");
Expression exp = Expression.Equal(property, constant);

这会导致错误:

Expression.Equal 没有为类型定义 'System.Nullable`1[System.Int32]' 和 'System.Int32'。

我尝试了几种方法来转换用户的参数,但没有取得多大成功。

  • Convert.ChangeType(constant, typeof(Car.Mileage)) 失败,因为 Mileage 的类型是 RuntimePropertyInfo。 (Source)
  • 我已经按照herehere 的描述尝试了Expression.Convert,但无法使其正常工作。

【问题讨论】:

  • 有什么意义? Int32.Parse() 不会生成可空值。
  • @hans 它不会生成一个可为空的,但 Expression.Equal() 会抱怨如果一个参数可以为空而另一个不是。

标签: c# .net linq entity-framework


【解决方案1】:

主要是通过重新阅读this post来弄清楚。

我不得不将 Expression.Convert 与属性 Expression 的类型一起使用:

Expression.Equal(property, Expression.Convert(constant, ((MemberExpression)property).Type));

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多