EF Core 2.1 浮点数转换问题

EF Core 2.1 Float Number Conversion Issue

我 运行 在 Entity Framework Core 2.1 中遇到查询生成问题。

我有一个问题

var q = KostenSchweissen.Where(k => k.Grenze >= ewd)
  .OrderBy(k => k.Grenze)
  .FirstOrDefault();

其中 KostenSchweissen.Grenze 是整数,但 ewd 是浮点数。

所以这会查找 "Grenze" 大于或等于向下传递的值的第一行。 这个 运行 以前很好(EF Core 1.x,不确定 2.0),但现在它正在生成查询(来自 SQL Server Profiler):

exec sp_executesql N'SELECT TOP(1) [k].[ID], [k].[Grenze], [k].[PreisEdelstahl], [k].[PreisNormalstahl]
FROM [KostenSchweissen] AS [k]
WHERE [k].[Grenze] >= @__ewd_0
ORDER BY [k].[Grenze]',N'@__ewd_0 smallint',@__ewd_0=17

其中 ewd 为 17.1。所以这完全忽略了 ewd 是一个浮动,显然返回了错误的成本。在查询中转换为 double 或 float 不起作用,我能想到的唯一解决方法是

    var q = KostenSchweissen.Where(k => k.Grenze * 1.0 >= ewd)
      .OrderBy(k => k.Grenze)
      .FirstOrDefault();

这显然不太好,因为它涉及到DB端计算。在我的案例中,查询不是性能关键,但我仍然想知道:这是一个错误,还是被认为是一个功能?如果是这样,为什么?这至少不是应该在某处宣布的重大更改吗?还是我只是盲目地找到它?

我试图在 EF 文档中找到任何提示 - 发行说明、重大更改、论坛...但找不到任何东西。

对于相关文档、最佳实践或任何其他可能有助于解决此问题的提示,我将不胜感激。

编辑:EF 核心团队已将此视为将在 3.0.0 中修复的错误 (https://github.com/aspnet/EntityFrameworkCore/issues/13908)。好的! 与此同时,有没有人知道我可以做什么作为解决方法?我是否必须手动查找可能发生这种情况的所有查询?

看起来这可能是 EF Core 中的错误 -

如果您注意到 .Where(k => k.Grenze >= 17.1) 将导致它使用值 17.1 生成 sql 查询,因为它不会将其生成到参数化查询中 - 当使用局部变量时,尽管它似乎正在转换它们与被映射的属性属于同一类型,这会导致舍入问题。

据我所知,这主要是预期的行为,以确保跨查询的类型一致,允许更好的索引等,尽管在 floatdoubledecimal 的情况下它会导致潜在的舍入问题。

建议在 GitHub 上为此提出问题,因为它可能(在您的情况下)导致不正确的查询结果。