Linq Query Обработка нулевых значений - PullRequest
3 голосов
/ 12 ноября 2011
From r In ReceiptLines
Where 
r.RECEIPT.RECEIPTDATE >= _reportStartDate 
And r.RECEIPT.RECEIPTDATE <= _reportEndDate
Let amount = r.QUANTITY * r.PRICE
Let discount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 
where discount > 0
Group By Department = r.ITEMSTYLE.ITEM.CATEGORY.DEPARTMENT.DEPARTMENTNAME
Into Sales = Sum(amount - discount), 
Average = Average(amount - discount), 
Count = Count()

Я выбираю все отделы и их продажи, в среднем, рассчитываю из таблиц ReceiptLine, Receipt, ReceiptDiscountПроблема, с которой я сталкиваюсь, состоит в том, что, если я удаляю, где скидка> 0, я получаю нулевое исключение.Но если я включу это, то я получу только те продажи, которые имеют скидку.Как бы написать запрос, который принесет все продажи за вычетом скидки (если он есть).Любая помощь высоко ценится.

Ответы [ 2 ]

8 голосов
/ 12 ноября 2011

Это распространенная ошибка LINQ2SQL.

Функция SUM в SQL возвращает ноль, если в коллекции нет элементов, но сигнатура Enumerable.Sum () возвращает int.Это дает исключение времени выполнения, когда SQL-запрос возвращает ноль, когда поставщик LINQ2SQL ожидает целое число.

Решение состоит в том, чтобы привести результат суммы к целому числу, допускающему нулевое значение, и использовать GetValueOrDefault для преобразования нулевого регистра в 0

Заменить

Let discount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 

на

Let discount = CType(r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT), Integer?).GetValueOrDefault(0)
1 голос
/ 12 ноября 2011

Вы пробовали:

...
Let amount = r.QUANTITY * r.PRICE
Let nDiscount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 
Let discount = IIf(nDiscount == Nothing, 0, nDiscount)
Group By Department = r.ITEMSTYLE.ITEM.CATEGORY.DEPARTMENT.DEPARTMENTNAME
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...