#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
}