42

如何检查FirstOrDefaultLINQ 函数返回的对象是否实际上是默认值?

例如:

Contact contact = dbo.contact
                     .Where(m => m.contactName == "Stackoverflow")
                     .FirstOrDefault();

是否有另一种方法来检查上面的联系人是否是默认值而不是使用以下?

if (!contact.contactName.Equals("Stackoverflow"))
    // do something
4

5 回答 5

58

您不需要执行等于检查,因为您的查询仅返回 contantName 为的对象Stackoverflow。当您使用FirstOrDefault它时,null如果没有找到任何对象,则返回,因此您可以这样做

if(contact == null)
    do something

如果 Contact 是一个类,你知道它是一个引用类型,所以它的默认值为 null。但是,您可以使用default.

if(contact == default(Contact))
    do something

正如评论中提到的,您可以通过使用FirstOrDefault带有谓词的重载来提高代码效率。

FirstOrDefault(m => m.contactName == "Stackoverflow") 

如果您的程序需要使用除 anull或之外的其他内容,您还可以更改返回的默认值0。例如

Contact defaultContact = new Contact();
defaultContact.ContactName = "StackExchange";

Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow")
                             .DefaultIfEmpty(defaultContact).First();

defaultContact如果没有找到其他对象,上面将返回该对象(而不是返回 null)。如果你这样做,那么你不需要检查null或者default(T)因为你知道你有一个Contact对象。

于 2013-08-12T09:59:55.553 回答
10

FirstOrDefault将返回null引用类型和default值类型。因此,您的测试无效。为了检查该值是否为默认值,您应该将其与default (Type)

Contact contact = dbo.contact.FirstOrDefault(m => m.contactName == "Stackoverflow");

if (!object.Equals(contact, default (Contact)))
    // Is not default

上面的代码适用于struct Contactclass Contact。我们还假设这default (Contact)永远不是我们查询的有效返回值。

于 2013-08-12T10:01:02.650 回答
4

FirstOrDefault() 代表第一个元素,如果未找到则该类型的“默认”值。它在内部使用default关键字返回默认值。

用法return default(Contact) or default(int)

例如,如果它是一个值类型,int那么它会返回 0。如果是引用类型,它将返回“ Null”等。

于 2013-08-12T10:02:21.203 回答
1

通常,FirstOrDefault返回您default为集合类型请求值的项目。如果是引用,它是null,如果是 int -0等等。

于 2013-08-12T10:04:05.800 回答
1

您可以使用

Contact contact = dbo.contact.where(m=>m.contactName!="" &&m.contactName!=null && m.contactName == "Stackoverflow").FirstOrDefault();
于 2013-08-12T10:02:00.180 回答