Quiero ejecutar una consulta como esta
var result = from entry in table
where entry.something == null
select entry;
y obtener un IS NULL
archivo.
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
. Sin embargo, mi código de producción fue
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. Tiene sentido en realidad. Cerraré esta pregunta
.net
entity-framework
ado.net
Adrian Zanescu
fuente
fuente
Respuestas:
Solución alternativa para Linq-to-SQL:
Solución alternativa para Linq-to-Entities (¡ay!):
Este es un error desagradable que me ha picado varias veces.
Si este error también te ha afectado, visita el informe de errores en UserVoice y hazle saber a Microsoft que este error también te 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á opt-in: debe habilitar manualmente una configuración para que
entry == value
funcione. Aún no se sabe qué es esta configuración. ¡Manténganse al tanto!Edición 2: de acuerdo con esta publicación del equipo de EF, ¡ este problema se ha solucionado en EF6! ¡Guau!
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 seUseCSharpNullComparisonBehavior
deberá establecer en falso para usar el comportamiento roto anterior.fuente
(var result = from ...; if(value.HasValue) result = result.Where(e => e.something == value) else result = result.Where(e => e.something == null);
(where Object.Equals(entry.something,value))
Desde Entity Framework 5.0, puede usar el siguiente código para resolver su problema:
Esto debería resolver sus problemas ya que Entity Framerwork utilizará una comparación nula 'C # como'.
fuente
Hay una solución alternativa un poco más simple que funciona con LINQ to Entities:
Esto funciona porque, como observó AZ, LINQ to Entities casos especiales x == null (es decir, una comparación de igualdad contra la constante nula) y lo traduce ax IS NULL.
Actualmente estamos considerando cambiar este comportamiento para introducir las comparaciones de compensación automáticamente si ambos lados de la igualdad son anulables. Sin embargo, hay un par de desafíos:
En cualquier caso, si nos ponemos manos a la obra dependerá en gran medida de la prioridad relativa que le asignen nuestros clientes. Si le preocupa el problema, le animo a que lo vote en nuestro nuevo sitio de Sugerencias de funciones: https://data.uservoice.com .
fuente
Si es un tipo que acepta valores NULL, tal vez intente usar la propiedad HasValue.
Sin embargo, no tengo ningún EF para probar aquí ... solo una sugerencia =)
fuente
== null
todos modos el error no afecta al uso . El punto es filtrar por el valor de una variable, cuyo valor podría ser nulo, y hacer que el valor nulo encuentre los registros nulos.(x => x.Column == null)
trabajar. :)System.NullReferenceException
, ya que el objeto ya es nulo!Referencia de MSDN : LINQ to SQL: Consulta integrada en lenguaje .NET para datos relacionales
fuente
para hacer frente a las comparaciones nulas, utilice en
Object.Equals()
lugar de==
ver esta referencia
fuente
null
,Object.Equals(null)
¿y si laObject
misma es nula?Señalando que todas las sugerencias de Entity Framework <6.0 generan algo de SQL incómodo. Vea el segundo ejemplo para una solución "limpia".
Solución ridícula
resultados en SQL como:
Solución indignante
Si desea generar un SQL más limpio, algo como:
resultados en lo que quería en primer lugar:
fuente
La consulta anterior funciona según lo previsto. Genera correctamente IS NULL. Sin embargo, mi código de producción fue
y el SQL generado fue algo = @p; @p = NULO. Parece que EF traduce correctamente la expresión constante, pero si hay una variable involucrada, la trata como una comparación normal. Tiene sentido en realidad.
fuente
Parece que Linq2Sql también tiene este "problema". Parece que hay una razón válida para este comportamiento debido a si los ANSI NULL están ENCENDIDOS o APAGADOS, pero desconcierta por qué un "== nulo" directo funcionará de hecho como se esperaba.
fuente
Personalmente, prefiero:
encima
porque evita la repetición, aunque eso no es matemáticamente exacto, pero se adapta bien a la mayoría de los casos.
fuente
No puedo comentar la publicación de divega, pero entre las diferentes soluciones presentadas aquí, la solución de divega produce el mejor SQL. Tanto en cuanto al rendimiento como a lo largo. Acabo de verificar con SQL Server Profiler y mirando el plan de ejecución (con "SET STATISTICS PROFILE ON").
fuente
Desafortunadamente, en Entity Framework 5 DbContext, el problema aún no está solucionado.
Usé esta solución alternativa (funciona con MSSQL 2012, pero la configuración ANSI NULLS podría quedar obsoleta en cualquier versión futura de MSSQL).
Cabe señalar que es una solución sucia pero que se puede implementar muy rápidamente y funciona para todas las consultas.
fuente
Si prefiere usar la sintaxis del método (lambda) como yo, puede hacer lo mismo como esto:
fuente
usa eso
fuente