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表中获取所有部门及其销售额(平均值)。我面临的问题是,如果我删除折扣&gt; 0,我得到null异常。但如果我把它包括在内,那么我只能得到有折扣的销售。 我如何编写使所有销售额减少折扣的查询(如果有的话)。任何帮助都非常感谢。
答案 0 :(得分:8)
这是LINQ2SQL常见的陷阱。
如果集合中没有项目,则SQL中的函数SUM
将返回null,但Enumerable.Sum()的签名将返回int。当SQL查询返回null,而LINQ2SQL提供程序需要一个整数时,这会产生运行时异常。
解决方案是将sum的结果转换为可以为null的整数,并使用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)
答案 1 :(得分:1)
你试过了吗?
...
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
...