首页 > 解决方案 > 如果 First() 不存在,如何在不引发异常的情况下获得它?[当 FirstOrDefault 没有帮助时]

问题描述

如果没有找到结果,我想在First不引发异常的情况下使用 Linq2Sql。

我知道FirstOrDefault,但是如果我收到默认值,我不知道它是在数据库中还是作为OrDefault.

有没有办法在First不引发异常但知道接收到值是否来自数据库的情况下获得?

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

标签: c#sql.netsql-serverlinq-to-sql

解决方案


如果我对您的理解正确,则出现问题是因为您正在投影一个可为空的列,并且您无法区分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.LastNamenull,则找到字段值为 的记录null


推荐阅读