2010-10-07 5 views
8

dans cet exemple le codeComment gérer aucun résultat dans 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(); 
} 

Comment dois-je gérer s'il n'y a pas de données en cmps?

cmpsne sera jamais nul, alors comment puis-je vérifier les données non existantes dans une requête LINQ ?

donc je peux éviter ce

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

lors de la transformation dans, par exemple, une Liste

GetCompanyById(1).ToList(); 

Est-ce que je toujours besoin de l'envelopper dans un bloc try catch?

Répondre

15

Vous pouvez utiliser Queryable.Any() (ou Enumerable.Any()) pour voir s'il y a un membre cmps. Cela vous permettrait de faire une vérification explicite, et de le gérer comme vous le souhaitez.

Si votre objectif est de revenir juste null s'il n'y a aucune correspondance, il suffit d'utiliser FirstOrDefault au lieu de d'abord dans votre déclaration de retour:

return cmps.FirstOrDefault(); 
+1

Cela devrait vraiment être la réponse acceptée IMO. –

5

Qu'en est-il de l'application .Any ou .Count()?

Voici un exemple sur MSDN

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

Ou utilisez simplement le: opérateur

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

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

De cette façon, si elle est nulle, il retourne simplement une entreprise nulle et si ce n'est pas le cas, il retournera le premier dans la liste.

Découvrez http://en.wikipedia.org/wiki/Ternary_operation

+0

plus facile à utiliser juste FirstOrDefault(), puisque c'est le comportement des FirstOrDefault() ... de plus, il vaut mieux préférer "Tout()" à « Count() == 0 ", depuis Count() forcera une évaluation complète s'il y a beaucoup d'éléments. –

+0

@Reed Copsey, Juste vu votre réponse à propos de FirstOrDefault() ne s'est pas rendu compte de ce qu'il a fait, certainement utile. Votre réponse est la bonne. +1 – Gage

2

Cela renverra le premier s'il y a une ou null si il n'y a pas:

return (from c in db.Companies 
where c.active == true && 
c.company_id == company_id 
select c).FirstOrDefault(); 
0
 var context = new AdventureWorksLT2008Entities(); 
     var cust = context.Customers.Where(c => c.CustomerID == 1); 
     if (cust.Any()) 
     { 
      Customer c = cust.First(); 
     } 
Questions connexes