Linq查询处理空值

时间:2011-11-12 16:15:08

标签: vb.net linq entity-framework

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异常。但如果我把它包括在内,那么我只能得到有折扣的销售。 我如何编写使所有销售额减少折扣的查询(如果有的话)。任何帮助都非常感谢。

2 个答案:

答案 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
...