实体框架 - Linq - 无法创建类型为“System.Object”的常量值。只有原始类型

时间:2010-12-08 17:46:26

标签: linq entity-framework expression-trees

我有一个为给定类型,属性和值的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()。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

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

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

不要对LinqToEntities说.Equals(x)