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,我会得到空异常。但如果我把它包括在内,那么我只会得到有折扣的销售。 我将如何编写查询以减少所有销售额的折扣(如果有的话)。非常感谢任何帮助。
最佳答案
这是 LINQ2SQL 的常见缺陷。
如果集合中没有项目,SQL 中的函数 SUM
返回 null,但 Enumerable.Sum() 的签名返回一个 int。当 SQL 查询返回 null 而 LINQ2SQL 提供程序需要一个整数时,这会产生运行时异常。
解决方案是将总和的结果转换为可为空的整数,并使用 GetValueOrDefault 将 null-case 转换为 0。
替换
Let discount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT)
与
Let discount = CType(r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT), Integer?).GetValueOrDefault(0)
关于vb.net - Linq 查询处理空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105678/