【问题标题】:Linq lambda expression throwing error if result set is null如果结果集为空,Linq lambda 表达式会抛出错误
【发布时间】:2012-06-15 04:06:15
【问题描述】:

在我的项目中,我需要使用 linq 选择一行值

try
{
return database.Employees.Where(x => id.Equals(x.ID)).Single();
}
catch (InvalidOperationException Ix)
{
    throw;
}

使用它,我将通过实体对象获取相应的行值。但是如果结果集为空,则会引发错误。问题是在我的项目中必须记录异常。 如何在不出现异常的情况下管理此代码。

【问题讨论】:

    标签: asp.net linq entity-framework lambda


    【解决方案1】:

    如果没有结果,您正在使用Single()(即documented)抛出异常。如果您不想要这种行为,请不要使用该方法:)

    如果您使用SingleOrDefault(),如果没有结果,它将返回 null。但是,如果有多个结果,它仍然会抛出异常。或者,您可以使用FirstOrDefault 来避免这种情况。

    请注意,您也可以在 Single / SingleOrDefault 中指定谓词,因此您不需要先调用 Where

    return database.Employees.SingleOrDefault(x => id.Equals(x.ID));
    

    【讨论】:

    • 好的,对于整行我使用了 First()。有什么建议可以代替 first() 吗?
    • @ROBIN:当然-FirstOrDefault。鉴于您的其他评论,听起来您可能误解了SingleFirst 之间的区别...
    • 是的,我认为有些误解。无论如何,非常感谢您的回答
    【解决方案2】:
    try
    {
      return database.Employees.SingleOrDefault(x => id.Equals(x.ID));
    
    
    }
    catch (InvalidOperationException Ix)
    {
      throw;
    }
    

    【讨论】:

    • 据我所知,single 是一列,First() 是一行。那么如何处理 first() 的异常?
    • @ROBIN:你的“知识”不正确。 SingleFirst 都从序列中提取单个元素 - 唯一的区别是,如果有多个元素可供选择,Single 会爆炸,而 First 返回第一个元素。
    • @ROBIN Jon 就在这里。如果您使用单行并且在过滤器之后有不止一行,那么您也会遇到错误,另一方面,首先您必须只选择行组中的第一行。
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多