【问题标题】:Linq Query Handling Null ValuesLinq 查询处理空值
【发布时间】:2011-11-12 16:15:08
【问题描述】:
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,我会得到空异常。但如果我把它包括在内,那么我只会得到有折扣的销售。 我将如何编写查询以减少所有销售额的折扣(如果有的话)。非常感谢任何帮助。

【问题讨论】:

  • 看起来您的代码是 VB.NET。我添加了那个标签,如果有错你可以更正。

标签: vb.net linq entity-framework


【解决方案1】:

这是 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)

【讨论】:

    【解决方案2】:

    你试过了吗:

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

    【讨论】:

    • 我认为 Muthu 的代码看起来像 VB.NET,三元运算符在 VB.NET 中读作IF(Condition, TrueValue, FalseValue)
    • 是的!很长一段时间习惯用c#编码。没有注意到这一点。谢谢。
    • and... null 在 VB.NET 中拼写为 Nothing。习惯了 c# 的时候写 VB.NET 感觉就像在键盘上倒了两杯咖啡。你只是像往常一样打字,但到处都是红色的曲线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多