从EF核心2.1.4开始,如果我们在聚合之前将int
的值强制转换为long
或long?
(可能是为了避免算术溢出),则此强制转换不会影响生成的查询,无论如何都会发生溢出。
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
之外)
答案 0 :(得分:2)
尝试Convert.ToInt64(x.Amount)
它可能会翻译为
SELECT SUM(CONVERT(bigint, [x].[Amount])) FROM [Payments] AS [x]
并运行而不会溢出
供将来的读者使用。这确实取决于 ORM ,并且可能并非在所有情况下都有效