如何在LINQ中处理没有结果?

时间:2010-10-07 18:32:54

标签: linq linq-to-entities nullable

在此示例代码中

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块中吗?

5 个答案:

答案 0 :(得分:15)

您可以使用Queryable.Any()(或Enumerable.Any())查看cmps中是否有成员。这将允许您进行显式检查,并按照您的意愿处理它。

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

return cmps.FirstOrDefault();

答案 1 :(得分:5)

如何申请.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;

答案 2 :(得分:2)

如果有的话,这将返回第一个,如果没有,则返回null:

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

        var context = new AdventureWorksLT2008Entities();
        var cust = context.Customers.Where(c => c.CustomerID == 1);
        if (cust.Any())
        {
            Customer c = cust.First(); 
        }