c# - 如果 First() 不存在,如何在不引发异常的情况下获得它?[当 FirstOrDefault 没有帮助时]
问题描述
如果没有找到结果,我想在First
不引发异常的情况下使用 Linq2Sql。
我知道FirstOrDefault
,但是如果我收到默认值,我不知道它是在数据库中还是作为OrDefault
.
有没有办法在First
不引发异常但知道接收到的值是否来自数据库的情况下获得?
我知道我可以先检查Any()
,但这意味着访问数据库两次。如果可能的话,我想避免这种情况。
解决方案
如果我对您的理解正确,则出现问题是因为您正在投影一个可为空的列,并且您无法区分FirstOrDefault()
返回 null 是因为该字段为 null 还是因为找不到记录:
var lastName = persons
.Where(p => p.FirstName == 'xxx')
.Select(p => p.LastName)
.FirstOrDefault();
一个简单的解决方法是将您的列投影为匿名类型:
var record = persons
.Where(p => p.FirstName == 'xxx')
.Select(p => new { p.LastName })
.FirstOrDefault();
这样,如果record
自身为空,则表示没有找到记录。但是,如果record
不是 null 而是record.LastName
null,则找到字段值为 的记录null
。