与NULL

时间:2015-07-23 11:31:10

标签: c# linq

我正在对数据库访问进行一些优化,并且一直在思考延迟执行。我已经了解到SomeQueriable.Count()SomeQueriable.ToList().CountSomeQueriable.ToArray().Length效率更高,因为它使用原生的DB COUNT方法。

但搜索结果本身呢?当我想将查询结果与null进行比较时,SomeQueriable == nullSomeQueriable.ToList() == null之间是否存在差异?

此外,使用SomeQueriable.Count()安全,还是必须始终检查null?换句话说,是

if (SomeQueriable == null || SomeQueriable.Count() == 0)

相同
if (SomeQueriable.Count() == 0)

或者后者会在没有找到记录的情况下导致异常吗?

3 个答案:

答案 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()) - 我最终会执行两次相同的查询。

相关问题