【问题标题】:How to handle no results in LINQ?如何处理 LINQ 中没有结果?
【发布时间】:2010-10-07 18:32:53
【问题描述】:

在此示例代码中

public Company GetCompanyById(Decimal company_id)
{
    IQueryable<Company> cmps = from c in db.Companies
                               where c.active == true && 
                                     c.company_id == company_id
                               select c;
    return cmps.First();
}

cmps没有数据怎么办?

cmps 永远不会为空,那么如何在 LINQ 查询中检查不存在的数据?

这样我可以避免这种情况

'cmps.ToList()' threw an exception of type ... {System.NullReferenceException}

将其转换为例如列表

GetCompanyById(1).ToList();

我是否总是需要将其包装在 try catch 块中?

【问题讨论】:

    标签: linq linq-to-entities nullable


    【解决方案1】:

    您可以使用Queryable.Any()(或Enumerable.Any())查看cmps中是否有成员。这将使您可以进行显式检查,并根据需要进行处理。

    如果您的目标是在没有匹配项的情况下仅返回 null,则只需在返回语句中使用 FirstOrDefault 而不是 First:

    return cmps.FirstOrDefault();
    

    【讨论】:

      【解决方案2】:

      应用 .Any 或 .Count() 怎么样?

      这是 MSDN 上的一个示例

      List<int> numbers = new List<int> { 1, 2 };
      bool hasElements = numbers.Any();
      Console.WriteLine("The list {0} empty.",
                          hasElements ? "is not" : "is");
      

      或者只使用 ?: 运算符

      return myExample.Any() ? myExample.First() : null;
      

      【讨论】:

        【解决方案3】:

        如果有则返回第一个,如果没有则返回 null:

        return (from c in db.Companies
        where c.active == true && 
        c.company_id == company_id
        select c).FirstOrDefault();
        

        【讨论】:

          【解决方案4】:

          试试return cmps.Count()==0?null:cmp.First()

          这样,如果它为空,它将简单地返回一个空公司,如果不是,那么它将返回列表中的第一个。

          查看http://en.wikipedia.org/wiki/Ternary_operation

          【讨论】:

          • 使用 FirstOrDefault() 更容易,因为这是 FirstOrDefault() 的行为...此外,最好选择“Any()”而不是“Count()==0”,因为 Count( ) 如果有很多元素,将强制进行全面评估。
          • @Reed Copsey,刚刚看到你关于 FirstOrDefault() 的回答并没有意识到它做了什么,肯定有用。你的答案是正确的。 +1
          【解决方案5】:
                  var context = new AdventureWorksLT2008Entities();
                  var cust = context.Customers.Where(c => c.CustomerID == 1);
                  if (cust.Any())
                  {
                      Customer c = cust.First(); 
                  }
          

          【讨论】:

            猜你喜欢
            • 2014-12-19
            • 1970-01-01
            • 2012-05-20
            • 2021-04-20
            • 2012-12-24
            • 1970-01-01
            • 2013-12-31
            • 2018-03-06
            • 2016-01-01
            相关资源
            最近更新 更多