我正在对数据库访问进行一些优化,并且一直在思考延迟执行。我已经了解到SomeQueriable.Count()
比SomeQueriable.ToList().Count
或SomeQueriable.ToArray().Length
效率更高,因为它使用原生的DB COUNT方法。
但搜索结果本身呢?当我想将查询结果与null进行比较时,SomeQueriable == null
和SomeQueriable.ToList() == null
之间是否存在差异?
此外,使用SomeQueriable.Count()
安全,还是必须始终检查null?换句话说,是
if (SomeQueriable == null || SomeQueriable.Count() == 0)
与
相同if (SomeQueriable.Count() == 0)
或者后者会在没有找到记录的情况下导致异常吗?
答案 0 :(得分:2)
SomeQueriable
之前, ToList
代表表达式树。评估SomeQueriable == null
时,您正在检查表达式树是否为null
。当您评估SomeQueriable.ToList() == null
时,您正在检查是否查看查询结果是null
哪个,我认为它不会 - 我认为它返回一个空集合,这是更惯用的。
只要SomeQueriable.Count()
明确分配,调用SomeQueriable
就是空的。就像任何其他变量一样,如果它有可能是null
,则添加空检查或使用C#6中的null-conditional operator。
答案 1 :(得分:0)
不,你必须检查null,正如你在source code here:
中看到的那样 public static int Count<TSource>(this IEnumerable<TSource> source)
{
if (source == null) throw Error.ArgumentNull("source");
答案 2 :(得分:0)
当您收到SomeQueriable.ToList()
等于null
时,就没有这种情况。此方法始终返回一个集合。即使您忘记将SomeQueriable
分配给某个值,您也会得到NullReferenceException
。
在我看来,在开发过程中应尽可能地限制对null引用的这种检查,以便更清楚地阅读代码。
因此,您应确保已为SomeQueriable
分配了一些查询,如果您想检查是否收到任何结果,请使用.Any()
if (SomeQueriable.Any())
但请注意,延迟执行有时可能很棘手。
如果您需要搜索结果并检查它们的存在 - 最好执行查询,例如通过调用.ToList()
然后执行检查:
var results = SomeQueriable.ToList();
var isAnyResults = results.Any();
因为如果你执行其他方式(首先.Any()
然后.ToList()
) - 我最终会执行两次相同的查询。