EF null检查group by子句

时间:2012-08-22 06:52:31

标签: c# linq entity-framework

我需要以下代码才能处理任何IQueryable,即使底层存储库只是一个数组。这在我的单元测试期间使用虚假的内存阵列后备存储器抛出NRE。显然因为y可能为null,尤其是在左外连接之后,y无法自助但是为空。

var x = from y in SomeIQueryable
        group y by y.someForeignKey
        into z
        select z;

我已将其更改为以下内容。

var x = from y in SomeIQueryable
        group y by y != null ? y.someForeignKey : null
        into z
        select z;

如上所述设置组会导致在针对实际的SQL后备存储运行时出现任何问题吗?

2 个答案:

答案 0 :(得分:0)

我对此类检查的体验是EF确实支持它们,将它们翻译为正确的SQL。但是,生成的SQL将包括空检查,并且至少在SQL Server上,查询将执行得更糟。对于复杂的查询,它变得明显。

但是只要第二种形式在你的查询中表现得足够好,它就足够了。

答案 1 :(得分:0)

一般来说,这样的修改不应该引起任何问题。如果是这样,您将生成一个异常,声称底层提供程序由于某种原因无法将查询转换为SQL。是的,任何问题都将是特定于提供商的问题,并且没有人能够回答它。

对于新的T-SQL(SqlServer),它应该可以正常工作(IIRC)通过计算列进行分组 - 对于SQL,您提供的表达式就是这样:计算列。

但是,你必须非常小心其他陷阱,因为在传递by-value和by-variable时,null检查的行为会有所不同。

如果查询包含x != null,则它将在SQL后端转换为x NOT NULL。但是,如果您按名称捕获值,甚至是本地的,即。 int? blah = null; .... from ... x != blah然后EF会将其“错误地”翻译为x <> @param @param = NULL代码将无法正常工作..

C#&lt; - &gt; SQL翻译有很多细微差别。但是,我没有看到您提供的确切代码中有任何危险。它看起来还不错。如果你试一次,如果它没有像NotSupportedException那样抛出,那么你可以认为它会正常工作。 linq提供程序通常会抛出该类的异常,如果它们无法正确翻译某些表达式。