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