gpt4 book ai didi

entity-framework-core - EF core 6 选择空值,尽管 where 子句要求非空

转载 作者:行者123 更新时间:2023-12-03 08:13:59 24 4
gpt4 key购买 nike

我有一个像这样的 Linq2Sql 查询:

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();

在从 EF core 5 迁移到 EF core 6 之前,此方法工作正常。对于 EF core 6,结果列表包含一些空值(不应出现这种情况,因为 where 条件要求非空值)。 EF core 6 中是否存在我不知道的重大更改/限制,或者这只是一个错误?

更新:这是输出的摘录

enter image description here

更新2:这是生成的SQL语句

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

所以看起来问题是 SomeOtherNullableDateTime (应该不为空)甚至没有包含在生成的 SQL 的 where 子句中。

更新 3:这是 SQL EF core 5(正确)生成的

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

最佳答案

GitHub 上的开发团队已确认有两个不同的错误导致了这些问题:

https://github.com/dotnet/efcore/issues/26744

https://github.com/dotnet/efcore/issues/26756

不幸的是,他们表示这些错误不会在计划于 12 月发布的 6.0.1 版本中修复,但最早会在计划于 2022 年 2 月发布的另一个版本中修复。

由于这些错误导致 EF core 6 悄悄地返回错误结果,并且许多用户很有可能搞乱他们的数据或根据错误数据做出决策(因为没有人会检查所有 Linq2SQL 查询是否生成正确的 SQL!? )我建议暂时不要使用 EF core 6!

这可能被视为基于意见,但请不要删除此答案,而是将其作为对其他开发人员的警告!

更新:现在这些问题已得到修复:

https://github.com/dotnet/efcore/pull/27284

https://github.com/dotnet/efcore/pull/27292

它们已获批准随版本 6.0.3 一起发布,计划于 2022 年 3 月发布。

关于entity-framework-core - EF core 6 选择空值,尽管 where 子句要求非空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70017594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com