我有一个为给定类型,属性和值的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()。任何建议将不胜感激。
答案 0 :(得分:3)
如果您说==
,则会生成BinaryExpression
,其中NodeType为ExpressionType.Equal
。 http://msdn.microsoft.com/en-us/library/bb361179.aspx
如果您说.Equals(x)
,则生成MethodCallExpression
。 LinqToEntities可能转换为Sql的MethodCallExpression
是一个限制列表(例如,您自己的未修饰方法都不在该列表中)。 Nullable<T>.Equals(x)
显然不在该列表中。
不要对LinqToEntities说.Equals(x)
。