我想使用Linq2Sql获得First
,而不引发异常,以防找不到结果。
我知道FirstOrDefault
,但如果我收到一个默认值,我不知道它是否在数据库中,或者它是否作为OrDefault
返回。
有没有一种方法可以在不引发异常的情况下获得First
,但在知道接收到的值是否来自数据库的情况下?
我知道我可以先检查Any()
,但这意味着要访问数据库两次。如果可能的话,我想避免这种情况。
如果我理解正确,您的问题发生是因为您投影了一个可为null的列,并且您无法区分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
本身为null,则表示未找到任何记录。但是,如果record
不为空,但record.LastName
为空,则找到字段值为null
的记录。