Как обрабатывать отсутствие результатов в LINQ?

в этом примере код

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 никогда не будет null, так как я могу проверить наличие несуществующих данных в запрос LINQ?

так что я могу избежать этого

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

при преобразовании его в, например,список

GetCompanyById(1).ToList();

Я всегда нужен чтобы завернуть его в try catch блок?

5 ответов


можно использовать Queryable.Any () (или перечисли.Any ()), чтобы увидеть, есть ли член в cmps. Это позволит вам выполнять явную проверку и обрабатывать ее так, как вы хотите.

Если ваша цель-просто вернуть null если нет совпадений, просто использовать FirstOrDefault вместо первого в вашем заявлении возврата:

return cmps.FirstOrDefault();

насчет применения .Любой или .Граф() ?

вот пример на 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;

это вернет первый, если он есть, или null, если его нет:

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

попробовать return cmps.Count()==0?null:cmp.First()

таким образом, если он равен null, он просто вернет нулевую компанию, а если нет, то он вернет первый в списке.

проверить http://en.wikipedia.org/wiki/Ternary_operation


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