vb.net - Linq 查询处理空值

标签 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 表中获取所有部门及其平均销售额。我面临的问题是,如果我删除折扣 > 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/

相关文章:

c# - 如何使用 Linq 从两个字典列表中获取唯一值?

.net - VB.NET 中的静态方法实现

.net - 随机 Linq 查询

.net - 将 PHP 正则表达式转换为 .NET

linq - 使用反射比较通用/动态 linq 谓词中的子属性

c# - 为 Entity Framework (或 Linq to SQL)生成的类添加数据注释

c# - Entity Framework : Eager loading with excludes instead of includes?

c# - Entity Framework 6 异步方法与同步方法的性能

vb.net - 查找 Outlook.MAPIFolder 的类型

asp.net - 根据 MS Access 查询的结果设置 gridview 列的值