Начиная с ядра 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
)