【问题标题】:Entity Framework - Linq - Unable to create a constant value of type ‘System.Object’. Only primitive types实体框架 - Linq - 无法创建“System.Object”类型的常量值。只有原始类型
【发布时间】:2010-12-09 02:31:31
【问题描述】:

我有一种方法可以为给定类型、属性和值的 linq 查询构建表达式。只要类型上的属性不可为空,这将非常有效。这是我正在使用的示例 (http://www.marcuswhitworth.com/2009/12/dynamic-linq-with-expression-trees) 我在属性上调用 Equals 方法。但是我发现 Nullable 类型的 Equals 方法将 Object 作为参数而不是 Nullable 类型。我尝试使用 GetValueOrDefault 隐藏空值,但 EF 不支持该方法。作为一个简单的例子,下面的代码会抛出一个错误:

decimal? testVal = new decimal?(2100);
        var test = (from i in context.Leases where i.AnnualRental.Equals(testVal) select i).ToList();

但是,如果您使用 == 而不是 Equals() 方法,它将可以正常工作。但是,我不确定如何将代码转换为使用 == 而不是 Equals() 。任何建议将不胜感激。

【问题讨论】:

  • 为什么== 在这种情况下不起作用?
  • 我会问和 cdhowie 一样的问题,当 == 几乎做同样的事情时,你为什么要使用 Equals? var test = context.Leases.Where(l => l.AnnualRental == testVal).ToList();应该可以正常工作吗?

标签: linq entity-framework expression-trees


【解决方案1】:

如果您说==,您将生成一个BinaryExpression,其NodeType 为ExpressionType.Equalhttp://msdn.microsoft.com/en-us/library/bb361179.aspx

如果你说.Equals(x),你会生成一个MethodCallExpression。 LinqToEntities 可能翻译成 Sql 的MethodCallExpressions 是一个有限的列表(例如,您自己的未修饰方法都不在该列表中)。 Nullable<T>.Equals(x) 显然不在该列表中。

不要对 LinqToEntities 说 .Equals(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多