2010-10-07 9 views
8

in questo codice di esempioCome gestire nessun risultato in 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(); 
} 

Come devo gestire se non v'è alcun dato in cmps?

cmpssarà mai nulla, così come posso verificare la presenza di dati non esistenti in un LINQ Query?

così posso evitare questo

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

quando trasformandolo in, per esempio, un elenco

GetCompanyById(1).ToList(); 

faccio sempre bisogno per avvolgerlo in un blocco try catch?

risposta

15

È possibile utilizzare Queryable.Any() (o Enumerable.Any()) per vedere se c'è un membro in cmps. Questo ti permetterebbe di fare un controllo esplicito e gestirlo come preferisci.

Se il vostro obiettivo è quello di tornare solo null se non ci sono le partite, basta usare FirstOrDefault al posto di primo nella sua dichiarazione di ritorno:

return cmps.FirstOrDefault(); 
+1

Questa dovrebbe essere la risposta accettata IMO. –

5

Cosa ne pensi dell'applicazione .Any o .Count()?

Ecco un esempio su MSDN

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

o semplicemente usare l'operatore?:

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

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

In questo modo se si tratta di nulla sarà semplicemente tornare una società nullo e se non lo è, restituirà il primo nell'elenco.

Partenza http://en.wikipedia.org/wiki/Ternary_operation

+0

più facile utilizzare solo FirstOrDefault(), dato che è il comportamento di FirstOrDefault() ... Inoltre, meglio preferire "Qualsiasi()" a "Count() == 0 ", poiché Count() forzerà una valutazione completa se ci sono molti elementi. –

+0

@Reed Copsey, Ho appena visto che la tua risposta su FirstOrDefault() non si è resa conto di quello che ha fatto, sicuramente utile. La tua risposta è quella giusta. +1 – Gage

2

Ciò restituirà il primo se ce n'è uno, o null se non v'è:

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(); 
     } 
Problemi correlati