Как обрабатывать отсутствие результатов в 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, он просто вернет нулевую компанию, а если нет, то он вернет первый в списке.
var context = new AdventureWorksLT2008Entities();
var cust = context.Customers.Where(c => c.CustomerID == 1);
if (cust.Any())
{
Customer c = cust.First();
}