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

entity-framework expression-trees linq

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

热门答案

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

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

不要说.Equals(x)到LinqToEntities。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因