Как преобразовать значение задолго до его агрегирования? - PullRequest
0 голосов
/ 05 ноября 2018

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

1 Ответ

0 голосов
/ 05 ноября 2018

Попробуйте Convert.ToInt64(x.Amount)

может перевести на

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

и работать без переполнения

Для будущих читателей. это действительно зависит от ORM и может работать не во всех случаях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...