【问题标题】:Prevent Entity Framework from casting防止实体框架强制转换
【发布时间】:2020-12-04 17:00:06
【问题描述】:

我有一个这样的分组查询:

from order in orders group by 
   new { CustomerID = order.CustomerID, 
         Year = order.OrderDate.Year, 
         Month = order.OrderDate.Month } into g 
   select new {
      Total = g.Sum(x => x.Quantity * x.UnitPrice }

我收到一个错误:

算术溢出

我查看了生成的 SQL,它试图将 Quantity 从 int 转换为十进制,因为 UnitPrice 是十进制。在 SQL 中,如果我不进行强制转换,查询就可以正常工作。

如何强制 EF 不将 Quantity 强制转换为十进制,以免引发异常?

【问题讨论】:

  • 在 C# 中将 UnitPrice 转换为 double 怎么样? (接受舍入误差)。
  • 溢出的数量和价格是多少?我怀疑还有其他问题,比如值为 null。
  • 它工作了@user2864740,我一直在摆弄这个问题,在c#中将其转换为double,使sql生成最终将数量和佣金都转换为“浮动”
  • @Ahmed 如果它有效并且您找到了解决方案,请在此处发布作为答案。这对其他人会有所帮助。
  • 我感谢@user2864740 给出了答案,但由于他将其作为评论,我无法将其标记为已回答,因此我将发布答案

标签: c# sql entity-framework linq entity-framework-core


【解决方案1】:

如果有人得到相同的算术溢出转换异常,这就是答案。关键是将decimal 值转换为double,以便生成的SQL 将两者都转换为float(奇怪但有效)。

发生这种情况的原因是因为 sql 是从 c# 表达式树中推导出来的,在 c# 中将十进制和整数相乘转换为将 int 向上转换为十进制,因为 * 需要 2 个相同类型的参数,这解释了结果 sql 试图强制转换数量到十进制,解决这个问题需要手动转换,希望这可以帮助其他面临同样问题的人:

from order in orders group by 
    new { CustomerID= order.CustomerID, 
    Year= order.OrderDate.Year, 
    Month= order.OrderDate.Month } into g 
    select new {
        Total= g.Sum(x=>x.Quanitty * (double)x.UnitPrice
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多