2011-08-21 25 views
5

Veo un comportamiento extraño en una consulta EF y me pregunto por qué está sucediendo. Con el siguiente código que no obtienen ningún resultado:Valor nulo del marco de la entidad en la consulta

if (category.Parent == null) 
{ 
    return Db.EventCategories.Where(c => c.Parent == category.Parent); 
} 

Pero con este código no se devuelven los resultados esperados:

if (category.Parent == null) 
{ 
    return Db.EventCategories.Where(c => c.Parent == null); 
} 

¿Cuál es la diferencia? ¿No es nulo siempre nulo? o ¿EF los trata como elementos diferentes cuando el valor es anulable (Parent es de tipo int?).

+0

¿Modifica el objeto 'category' antes de ejecutar realmente la consulta? – svick

+0

No, yo no. Creo que @ a1ex01 es correcto, si no usas la constante nula, no generará la consulta IS NULL – willvv

+0

¿Has verificado el SQL generado? – svick

Respuesta

2

No estoy 100% seguro, pero creo que la primera declaración genera algo así como SELECT ... FROM category, eventcategories WHERE category.parent = eventcategories.parent (que devuelve el conjunto de registros vacío si category.parent es nulo), mientras que el segundo ... WHERE eventcategories.parent IS NULL.

0

Consulte una explicación detallada en este artículo: NULL Value Handling in Entity Framework. Tenga en cuenta que EF 5.0, 6.0 y 6.1 manejan los valores que aceptan nulos de manera diferente. En EF 5.0, deberá probar manualmente los nulos; una comparación de ecuaciones entre dos variables no prueba nulos por defecto. También puede activar manualmente la propiedad UseCSharpNullComparisonBehavior en el DbContext.ContextOptions para lograr el mismo efecto. En EF 6.0, la comparación nula está activada por defecto, pero probablemente de forma exagerada e incluso en columnas que no admiten nulos, lo que da como resultado un rendimiento más lento. Se supone que EF 6.1 ha modificado el algoritmo para probar solo valores nulos cuando sea necesario.

Cuestiones relacionadas