es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EF Core 6 seleccionando valores nulos a pesar de la cláusula WHERE que solicita que no sean nulos.

Tengo una consulta Linq2Sql como esta:

Parent.Include(p => p.Children)
.Where(p => p.Children.Any(c => c.SomeNullableDateTime == null)
&& p.Children
.Where(c => c.SomeNullableDateTime == null)
.OrderBy(c => c.SomeInteger)
.First()
.SomeOtherNullableDateTime != null
)
.Select(p => p.Children
.Where(c => c.SomeNullableDateTime == null)
.OrderBy(c => c.SomeInteger)
.First()
.SomeOtherNullableDateTime)
.ToList();

Esto funcionaba bien hasta el cambio de EF Core 5 a EF Core 6. Con EF Core 6, la lista de resultados contiene algunos valores nulos (lo cual no debería ser el caso porque la condición where pide que no sea nulo). ¿Hay algún cambio/limitación en EF Core 6 del que no sea consciente o es simplemente un error?

Actualización: Este es un extracto de la salida.

Actualización 2: Esta es la sentencia SQL generada

SELECT(
SELECT TOP(1)[p1].[SomeOtherNullableDateTime]
FROM[Children] AS[p1]
WHERE([p].[Id] = [p1].[ParentId]) AND[p1].[SomeNullableDateTime] IS NULL
ORDER BY[p1].[SomeInteger])
FROM[Parent] AS[p]
WHERE EXISTS(
SELECT 1
FROM[Children] AS [c]
WHERE ([p].[Id] = [c].[ParentId]) AND[c].[SomeNullableDateTime] IS NULL) AND EXISTS(
SELECT 1
FROM[Children] AS [c0]
WHERE ([p].[Id] = [c0].[ParentId]) AND[c0].[SomeNullableDateTime] IS NULL)
GO

Así que parece que el problema es que SomeOtherNullableDateTime (que se supone que no es nulo) ni siquiera está incluido en la cláusula where de la SQL generada.

Actualización 3: Esta es la SQL que EF Core 5 (correctamente) genera

SELECT (
SELECT TOP(1) [c].[SomeOtherNullableDateTime]
FROM [Children] AS [c]
WHERE ([p].[Id] = [c].[ParentId]) AND [c].[SomeNullableDateTime] IS NULL
ORDER BY [c].[SomeInteger])
FROM [Parent] AS [p]
WHERE EXISTS (
SELECT 1
FROM [Children] AS [c0]
WHERE ([p].[Id] = [c0].[ParentId]) AND [c0].[SomeNullableDateTime] IS NULL) AND (
SELECT TOP(1) [c1].[SomeOtherNullableDateTime]
FROM [Children] AS [c1]
WHERE ([p].[Id] = [c1].[ParentId]) AND [c1].[SomeNullableDateTime] IS NULL
ORDER BY [c1].[SomeInteger]) IS NOT NULL
GO

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que EF Core 6 está omitiendo la última parte de la cláusula where ([c1].[SomeOtherNullableDateTime] NO ES NULO).

    Parece ser que EF Core 6 está omitiendo la última parte de la cláusula where ([c1].[SomeOtherNullableDateTime] NO ES NULO). Esto podría ser un cambio rompedor o una limitación en EF Core 6, o también podría ser un error.

Comments are closed.