¿Cómo puedo consultar valores nulos en el marco de la entidad?

Resuelto Adrian Zanescu asked hace 15 años • 14 respuestas

Quiero ejecutar una consulta como esta.

   var result = from entry in table
                     where entry.something == null
                     select entry;

y obtener un IS NULLgenerado.

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.

Adrian Zanescu avatar Mar 25 '09 23:03 Adrian Zanescu
Aceptado

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 UseCSharpNullComparisonBehavioren 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#'.

ITmeze avatar Mar 19 '2013 15:03 ITmeze

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 =)

Svish avatar Mar 26 '2009 11:03 Svish
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

Konstantin Tarkus avatar Mar 25 '2009 16:03 Konstantin Tarkus