Запретить приведение Entity Framework

#c# #sql #entity-framework #linq #entity-framework-core

#c# #sql #entity-framework #linq #entity-framework-core

Вопрос:

У меня есть запрос, выполняющий группировку, подобную этой :

 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 в decimal, поскольку UnitPrice значение является десятичным. В SQL запрос работает нормально, если я не выполняю приведение.

Как я могу заставить EF не выполнять приведение Quantity к десятичной системе, чтобы она не вызывала исключения?

Комментарии:

1. Как насчет приведения UnitPrice к двойному значению в C #? (допускаю ошибки округления).

2. Какое количество и цена приводят к переполнению? Я подозреваю, что что-то еще не так, например, значение равно null.

3. Это сработало @user2864740, я некоторое время возился с этим, приведя его к удвоению в c #, в результате чего sql generate привел как количество, так и комиссию к «как float», наконец

4. @Ahmed Если это сработало и вы нашли решение, тогда опубликуйте здесь ответ. Это помогло бы другим.

5. Я благодарю @user2864740 за ответ, но поскольку он поместил его в качестве комментария, я не могу пометить его как ответ, поэтому я опубликую ответ

Ответ №1:

Вот ответ, если кто-то получил такое же исключение приведения с арифметическим переполнением. Ключ в том, чтобы привести decimal значение к double , чтобы сгенерированный SQL приводил оба значения к значению float (странно, но сработало).

Причина, по которой это происходит, заключается в том, что sql выделен из дерева выражений c #, умножение decimal и integer приводит к преобразованию int в decimal в c #, поскольку * принимает 2 параметра одного типа, что объясняет результирующий sql, пытающийся преобразовать количество в decimal, для решения этой проблемы требуется ручное приведение, надеюсь, это поможет кому-то еще, столкнувшемуся с такой же проблемой :

 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
        }