2010-10-07 20 views
8

en este código de ejemplo¿Cómo no se manejan los resultados en 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(); 
} 

¿Cómo debo manejar si hay hay datos en cmps?

cmpsnunca será nula, así que ¿cómo puedo comprobar los datos no existentes en una consulta de LINQ ?

por lo que puede evitar esto

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

cuando transformándolo en, por ejemplo, una lista de

GetCompanyById(1).ToList(); 

qué siempre necesito a envolverlo en un bloque try catch?

Respuesta

15

Puede utilizar Queryable.Any() (o Enumerable.Any()) para ver si hay un miembro en cmps. Esto le permitiría hacer comprobaciones explícitas y manejarlas como lo desee.

Si su objetivo es simplemente volver null si no hay coincidencias, sólo tiene que utilizar FirstOrDefault en lugar de Primero en su sentencia de retorno:

return cmps.FirstOrDefault(); 
+1

Esta realmente debería ser la respuesta aceptada OMI. –

5

¿Qué hay de la aplicación. Cualquier o .Count()?

He aquí un ejemplo en MSDN

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

O simplemente utilizar el operador?:

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

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

De esta forma si es nula simplemente devolverá una empresa nula y si no es así, devolverá el primero en la lista.

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

+0

más fácil usar FirstOrDefault(), ya que es el comportamiento de FirstOrDefault() ... también, mejor preferir "Cualquier()" a "Count() == 0 ", desde el conteo() forzará una evaluación completa si hay muchos elementos. –

+0

@Reed Copsey, acaba de ver que su respuesta sobre FirstOrDefault() no se dio cuenta de que eso era lo que hacía, definitivamente útil. Tu respuesta es la correcta. +1 – Gage

2

Esto devolverá la primera, si lo hay, o null si no hay:

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(); 
     } 
Cuestiones relacionadas