LINQ TO SQL: Uso de NULL

Leyendo C# 3.0 in a Nutshell (Pedazo de libro) he podido aprender acerca del uso de null en consultas LINQ TO SQL y voy a intentar explicarlo como yo lo he entendido.

Partiendo de esta tabla de ejemplo:

linqtosql2

linqtosql

 

Vamos a empezar a lanzar consultas utilizando LINQPad y a observar los resultados:

Customers.Where(c => c.Telephone == null).Dump("IS NULL");

 

linqtosql3

La sentencia SQL que se genera:

SELECT [t0].[CustomerId], [t0].[Name], [t0].[Surname], [t0].[Telephone], [t0].[Email]
FROM [Customers] AS [t0]
WHERE [t0].[Telephone] IS NULL

Como vemos, la instrucción c.Telephone == null, LINQ to SQL la está traduciendo a IS NULL, que como sabemos es la manera de consultar por valores nulos en TSQL.

¿Que pasa sí en vez de utilizar el valor estático null usamos una variable de tipo Nullable<T>?

int? telephone = null;
Customers.Where(c => c.Telephone == telephone).Dump(" = @P");

 

Pues que no retorna nada y el porque se puede apreciar en la consulta SQL que LINQ to SQL emite:

SELECT [t0].[CustomerId], [t0].[Name], [t0].[Surname], [t0].[Telephone], [t0].[Email]
FROM [Customers] AS [t0]
WHERE [t0].[Telephone] = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [Null]

 

Está claro no? No podemos hacer comparaciones en TSQL del Tipo Campo = NULL

¿Cómo se puede solucionar esto?

Usando object.Equals, que sí el valor de la variable es NULL, LINQ generará un IS NULL y sí tiene valor generará = @p

Customers.Where(c => object.Equals(c.Telephone, telephone)).Dump("object.Equals nullable");

 

linqtosql4

SELECT [t0].[CustomerId], [t0].[Name], [t0].[Surname], [t0].[Telephone], [t0].[Email]
FROM [Customers] AS [t0]
WHERE [t0].[Telephone] IS NULL

 

Y sí la variable tiene valor:

telephone = 999999999;
Customers.Where(c => object.Equals(c.Telephone, telephone)).Dump("object.Equals non nullable");

 

linqtosql5

SELECT [t0].[CustomerId], [t0].[Name], [t0].[Surname], [t0].[Telephone], [t0].[Email]
FROM [Customers] AS [t0]
WHERE ([t0].[Telephone] IS NOT NULL) AND ([t0].[Telephone] = @p0)
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [999999999]

Stored Procedures:

Una cosa que hago desde hace tiempo en mi SPs es utilizar sentencias del tipo:

(ISNULL(Name,0) LIKE ISNULL(@Name,ISNULL(Name,0)))

 

para crear consultas dinámicas y he estado intentando hacerlo desde LINQ to SQL pero no lo he conseguido y no sé sí se podrá claro :)

Así que he optado por crear el SPs tal cual el ejemplo:

CREATE PROCEDURE [dbo].[sp_GetCustomers]
    @Name nvarchar(50),
    @Surname nvarchar(50),
    @Telephone int,
    @Email nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;
 
    SELECT    Name,
            Surname,
            Telephone,
            Email
    FROM    Customers
    WHERE        (ISNULL(Name,0) LIKE ISNULL(@Name,ISNULL(Name,0)))
    AND            (ISNULL(Surname,0) LIKE ISNULL(@Surname,ISNULL(Surname,0)))
    AND            (ISNULL(Telephone,0) = ISNULL(@Telephone,ISNULL(Telephone,0)))
    AND            (ISNULL(Email,0) = ISNULL(@Email,ISNULL(Email,0)))
END
 
Y llamarlo directamente:
 
var customers1 = sp_GetCustomers(null,null,null,null);
 
customers1.Dump("SP ALL NULL");
 
var customers2 = sp_GetCustomers("michael",null,null,null);
 
customers2.Dump("SP Name");

linqtosql6

Pues esto es todo!!!

Published 11/3/2009 22:34 por Luis Ruiz Pavón
Archivado en: ,,,,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2009/03/11/linq-to-sql-uso-de-null.aspx

Comentarios

# re: LINQ TO SQL: Uso de NULL

si estas enterado que linq 2 sql alli quedo? - ya murio -  y que ms apuesta ahora por Linq 2 object?  

Salu2

Ddaz

Thursday, March 12, 2009 1:32 AM por David Daniel Arroyo Zari "Ddaz"

# re: LINQ TO SQL: Uso de NULL

si estas enterado que linq 2 sql alli quedo? - ya murio -  y que ms apuesta ahora por Linq 2 cualquier cosa?  

Salu2

Ddaz

Thursday, March 12, 2009 1:32 AM por David Daniel Arroyo Zari "Ddaz"

# re: LINQ TO SQL: Uso de NULL

jeje no se si salio el otro coment... pero es linq 2 entity  

Thursday, March 12, 2009 1:33 AM por David Daniel Arroyo Zari "Ddaz"

# re: LINQ TO SQL: Uso de NULL

@Daniel,

Lo que dices es incorrecto. LINQ to SQL no ha muerto, ni tampoco va a morir. Recomiendo leer entrevista con Danny Simmons, Dev Manager de Entity Framework y LINQ to SQL en el ejemplar de abril de dotNetmanía, que saldrá en unos días.

Por lo demás, el problema de la gestión de los nulos que resuelve Luis aquí se presenta de manera muy similar en Entity Framework.

@Luis,

¡Excelente serie!

Coincido contigo en que "C# 3.0 in a nutshell" es un pedazo de libro, así como también "C# in depth" de Jon Skeet.

Salu2,

Octavio

Thursday, March 12, 2009 10:50 AM por Octavio Hernández

# re: LINQ TO SQL: Uso de NULL

Gracias Octavio, viendo de un maestro de LINQ como tú ;)

Me apunto el libro ;)

Salu2

Thursday, March 12, 2009 4:26 PM por Luis Ruiz Pavón

# re: LINQ TO SQL: Uso de NULL

y por en lo que lei decian "que ya no van a hacer mas cosas"con linq  2sql...,  lei en el blog de los de EF ...  dicen que no esta muerto pero a su vez dicen que ya no van a hacer nada alli... por algo EF dejo de usar linq 2sql.. no?? - para la proxima version - .. logicamente oficialmente no van a decir "esta muerto" .. pero el echo de que lo dejen de lado,  y que ya no le vayan a mover mas..., algo con lo que estoy de acuerdo, ya que Linq 2SQL es el "Typed dataset " del 2008 xD  

Salu2

Ddaz

Thursday, March 12, 2009 7:20 PM por David Daniel Arroyo Zari "Ddaz"

# re: LINQ TO SQL: Uso de NULL

les dejo unos links para que le den una ojeada xD :

www.stephenforte.net/PermaLink,guid,bc1bc043-3cdc-4ac2-8b46-3c72ad1d61cf.aspx

blogs.microsoft.co.il/.../no-pulse-we-have-a-dead-linq-2-sql-on-our-hands.aspx

codebetter.com/.../linq-to-sql-is-dead-read-between-the-lines.aspx

y repito... si linq2sql fuera tan bueno, por que cambiaron a linq2 entity??... simple.. ms se dio cuenta del error  xD.

Salu2

Ddaz

Thursday, March 12, 2009 7:27 PM por David Daniel Arroyo Zari "Ddaz"

# re: LINQ TO SQL: Uso de NULL

@David Daniel Arroyo Zari "Ddaz"

Al percatarme de sus ocurrentes "xD" y nerviantes puntos suspensivos, atino a decir firmemente lo siguiente; Su ignorancia en cuanto a LINQ2SQL se refiera es la mas vaga y sutil que eh conocido hasta el dia de hoy, por ello le recomiendo leer algunos libros de Arquitectura de Software, sobretodo si usted se considera un profesional en las TI, creo que ya deberia considerar que no para todo escenario se emplean las mismas tecnologias, o acaso usted solo decide emplear aquellas que son denominadas "last year" - "Most Hot" - "Futures..."?

Respetando su conocimiento, sabia usted que al apostar por el uso de EF se debe atener a consecuencias actuales como la restriccion de Objetos de Negocio y funcionalidad (pasando por USPs complejos)?

Saludos

Friday, May 08, 2009 12:25 AM por Angel Escobedo