¿Cómo puedo consultar valores nulos en el marco de la entidad?
Quiero ejecutar una consulta como esta.
var result = from entry in table
where entry.something == null
select entry;
y obtener un IS NULL
generado.
Editado: después de las dos primeras respuestas, siento la necesidad de aclarar que estoy usando Entity Framework y no Linq to SQL. El método object.Equals() no parece funcionar en EF.
Edición n.º 2: la consulta anterior funciona según lo previsto. Genera correctamente IS NULL
. Mi código de producción sin embargo era
value = null;
var result = from entry in table
where entry.something == value
select entry;
y el SQL generado fue something = @p; @p = NULL
. Parece que EF traduce correctamente la expresión constante, pero si hay una variable involucrada, la trata como una comparación normal. En realidad tiene sentido. Cerraré esta pregunta.
Solución alternativa para Linq-to-SQL:
var result = from entry in table
where entry.something.Equals(value)
select entry;
Solución alternativa para Linq-to-Entities (¡ay!):
var result = from entry in table
where (value == null ? entry.something == null : entry.something == value)
select entry;
Este es un error desagradable que me ha picado varias veces. Si este error también le ha afectado a usted, visite el informe de error en UserVoice e informe a Microsoft que este error también le ha afectado.
Editar: ¡ Este error se está solucionando en EF 4.5 ! ¡Gracias a todos por votar a favor de este error!
Para compatibilidad con versiones anteriores, será opcional; deberá habilitar manualmente una configuración para que funcione entry == value
. Aún no se sabe cuál es esta configuración. ¡Manténganse al tanto!
Edición 2: Según esta publicación del equipo de EF, ¡este problema se solucionó en EF6! ¡Guau!
Cambiamos el comportamiento predeterminado de EF6 para compensar la lógica de tres valores.
Esto significa que el código existente que se basa en el comportamiento anterior ( null != null
, pero solo cuando se compara con una variable) deberá cambiarse para no depender de ese comportamiento o establecerse UseCSharpNullComparisonBehavior
en falso para usar el comportamiento antiguo roto.
Desde Entity Framework 5.0, puede utilizar el siguiente código para resolver su problema:
public abstract class YourContext : DbContext
{
public YourContext()
{
(this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
}
}
Esto debería resolver sus problemas ya que Entity Framework utilizará una comparación nula 'similar a C#'.
Si es un tipo que acepta valores NULL, ¿tal vez intente utilizar la propiedad HasValue?
var result = from entry in table
where !entry.something.HasValue
select entry;
Aunque no tengo ningún EF para probar aquí... sólo una sugerencia =)
var result = from entry in table
where entry.something.Equals(null)
select entry;
Referencia de MSDN : LINQ to SQL: consulta integrada en lenguaje .NET para datos relacionales