如何在汇总之前将值转换为长值?

时间:2018-11-05 11:20:18

标签: c# entity-framework-core sql-server-2017 ef-core-2.1

从EF核心2.1.4开始,如果我们在聚合之前将int的值强制转换为longlong?(可能是为了避免算术溢出),则此强制转换不会影响生成的查询,无论如何都会发生溢出。

using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;

namespace EfCoreBugs
{
  class Program
  {
    static void Main(string[] args)
    {
      using (var dbContext = new MyDbContext())
      {
        Console.WriteLine(dbContext.Payments.Sum(x => (long?)x.Amount));
      }
      Console.ReadLine();
    }

    public class MyDbContext : DbContext
    {
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
        optionsBuilder.UseSqlServer(@"Server=.;Database=EfCoreBugs;Trusted_Connection=True;MultipleActiveResultSets=True;");
      }
      public DbSet<Payment> Payments { get; set; }
    }

    public class Payment
    {
      public int Id { get; set; }
      public int Amount { get; set; }
    }
  }
}

生成的查询为:

SELECT SUM([x].[Amount])
FROM [Payments] AS [x]

有什么办法可以解决此溢出问题? (除了将Amount的数据类型更改为long之外)

1 个答案:

答案 0 :(得分:2)

尝试Convert.ToInt64(x.Amount)

它可能会翻译为

SELECT SUM(CONVERT(bigint, [x].[Amount])) FROM [Payments] AS [x] 

并运行而不会溢出

供将来的读者使用。这确实取决于 ORM ,并且可能并非在所有情况下都有效