【问题标题】:How do i handle .FirstOrDefault method?我如何处理 .FirstOrDefault 方法?
【发布时间】:2012-08-23 15:57:28
【问题描述】:

当我使用.FirstOrDefault 方法查询数据库时,我如何处理它给我的结果?我特别关心空值,目前我有这样的事情:

if (result == default(TypeOfResult))
{
    handleIt();
}

但我不完全知道这个“默认”是什么,所以我想知道这样做是否更好:

if (result == null)
{
    handleIt();
}

哪一个会起作用?而这个“默认”究竟是什么?

【问题讨论】:

标签: c# .net entity-framework ef-code-first


【解决方案1】:

FirstOrDefault 将返回序列中的第一个元素,或者直接返回相关类型的默认值。

因此,根据您查询的内容,默认值可能会发生变化。例如,int 的集合,default 的值将为 0。因此,检查 null 是否不起作用。

考虑:

List<int> s = new List<int>();
var x = s.FirstOrDefault();

这里x 等于0

引用类型呢?

List<MyCustomClass> s = new List<MyCustomClass>();
var x = s.FirstOrDefault();

这里x 将是null

这可能是两种方法中更好的一种:

if (result == default(TypeOfResult))
{
   handleIt();
}

【讨论】:

    【解决方案2】:

    如果TypeOfResult 是引用类型,那么

    result == default(TypeOfResult)result == null 意思相同

    因为null中引用类型的默认值。

    default keyword 只返回给定类型的“默认值”,如果是null 中的引用类型。对于值类型,它取决于类型,例如0 代表int 等。

    顾名思义,FirstOrDefault 将返回集合的第一个元素,如果集合为空,则返回给定类型的默认值。

    【讨论】:

      【解决方案3】:

      如果您想确保您的代码可以使用 default(T) 进行故障保存,其中 T 是一个值类型,您可以将您的项目装箱到 Nullable 对象中。

      例如:

      var ints = new List<int>(){1,2,3,4,6};
      int result = ints.Where(i => i == 0).FirstOrDefault();
      

      即使列表中没有 0,结果也是 0!

      var ints = new List<int>(){1,2,3,4,6};
      var nullable = ints.Select(i => new Nullable<int>(i));
      var result = nullable.Where(i => i == 0).FirstOrDefault()
      

      结果为空,列表中没有0!

      这当然更慢并且需要更多内存,但也适用于非值类型。

      【讨论】:

        【解决方案4】:

        您应该检查 Null。 如果找不到任何结果,FirstOrDefault 将返回 NULL。

        看到这个POST

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 2016-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多