我该如何处理.FirstOrDefault方法?

时间:2012-08-23 15:57:28

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

当我使用.FirstOrDefault方法查询数据库时,如何处理它给我的结果?我特别关注空值,目前我有类似的东西:

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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();

此处xnull

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

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

答案 1 :(得分:6)

如果TypeOfResult是参考类型,那么

result == default(TypeOfResult)result == null 表示同样的事情

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

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

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

答案 2 :(得分:1)

如果你想确保你的代码可以使用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!

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

答案 3 :(得分:0)

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

请参阅此POST