如果不存在,如何在不引发异常的情况下获取First()? [当FirstOrDefault没有帮助时]

时间:2018-12-02 21:17:19

标签: c# sql .net sql-server linq-to-sql

我想使用Linq2Sql来获得First而不会引发异常,以防万一找不到结果。

我知道FirstOrDefault,但是如果收到默认值,我不知道它是否在数据库中或是否作为OrDefault返回。

有没有一种方法可以获取First而不会引发异常,但是 知道接收的值是否来自数据库?

我知道我可以先检查Any(),但这意味着要两次访问数据库。我想避免这种情况。

1 个答案:

答案 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