0

我需要以下代码来处理任何 IQueryable,即使底层存储库只是一个数组。在我的单元测试期间,这会在内存阵列后备存储中使用伪造的 NRE 引发。显然,因为y可能为空,尤其是在左外连接之后,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 后备存储运行时,按上述方式设置组会导致任何问题吗?

4

2 回答 2

0

我对此类检查的经验是 EF 确实支持它们,会将它们转换为正确的 SQL。但是,生成的 SQL 将包括空检查,并且至少在 SQL Server 上,查询的性能会稍差一些。对于复杂的查询,它变得很明显。

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

于 2012-08-22T07:29:17.377 回答
0

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

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

但是,您必须非常小心其他陷阱,例如,当按值传递和按变量传递时,空检查的行为会有所不同..

如果查询完全包含,x != null那么它将被翻译到x NOT NULLSQL 后端。但是,如果您按名称捕获值,甚至是本地值,即。int? blah = null; .... from ... x != blah然后 EF 将“错误地”翻译它x <> @param@param = NULL因为代码将无法按预期工作..

C#<->SQL 翻译还有更多这样的细微差别。但是,在您提供的确切代码中,我没有看到任何危险。它看起来不错。如果您尝试一次并且如果它没有抛出类似的东西NotSupportedException,那么您可以假设它会正常工作。如果 linq 提供程序不能正确翻译某些表达式,它们通常会抛出该类的异常。

于 2012-08-22T07:39:11.097 回答