我需要以下代码才能处理任何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后备存储运行时出现任何问题吗?
答案 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提供程序通常会抛出该类的异常,如果它们无法正确翻译某些表达式。