2011-06-22 11 views
9

Tengo el siguiente código:Lambda vs LINQ- "La expresión es siempre falsa"

var thing = (from t in things 
      where t.Type == 1 && t.IsActive 
      select t).SingleOrDefault(); 

if (thing == null) 
{ 
    // throw exception 
} 

things es una colección de entidades Entidades marco de seguimiento automático

Esto funciona muy bien, sin embargo quiero usar una expresión Lambda lugar y cambió el LINQ a esto:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

Ahora ReSharper me está diciendo Expression is always false para (thing == null).

¿Qué me he perdido?

Respuesta

15

que desee:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

Select realiza una proyección (la conversión del tipo de la IEnumerable IEnumerable<Thing>-IEnumerable<bool> con valores true si t.Type == 1 && t.IsActive == true, de lo contrario false), entonces el SingleOrDefault retornos ya sea el único bool en esta secuencia o el valor predeterminado de bool que es false si la secuencia está vacía. Esto nunca puede ser nulo ya que bool no es un tipo de referencia.

Where realiza una acción de filtrado (sacando sólo aquellos objetos que cumplen un criterio dado - en este caso sólo la selección de aquellos en los que Type es 1 y IsActive es true), dejando el tipo de la IEnumerable como IEnumerable<Thing>. Suponiendo que Thing es una clase, SingleOrDefault devolverá el único elemento en la secuencia o null.

En cualquier caso, SingleOrDefault lanzará una excepción si la secuencia contiene más de un elemento (¡lo cual es mucho más probable en la versión Select!).

+1

impresionante. ¡muchas gracias! – Shevek

Cuestiones relacionadas