对于没有订单的客户,Linq to SQL中的异常处理

时间:2010-05-22 00:50:39

标签: c# linq linq-to-sql

我有以下代码来检索Northwind数据库中到达客户的客户名称,总计(订单),总和(订单详细信息)。下面的代码的问题是它引发了一个异常,因为一些客户在订单表中没有任何条目。

我知道使用查询语法(join)可以避免异常。我想知道是否可以使用扩展方法语法处理相同的内容。

 var customerOrders = db.Customers
    .Select(c => new 
    { 
        CompanyName = c.CompanyName, 
        TotalOrders = c.Orders.Count(), 
        TotalQuantity = c.Orders
            .SelectMany(o => o.Order_Details).Sum(o=>o.Quantity) 
    });

4 个答案:

答案 0 :(得分:3)

我认为问题是在SQL中,SUM函数可以返回null,而Ling-to-SQL期望一个int。你可以这样做:

  TotalQuantity = 
    (int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity)

然后检查空值。 我认为这也有效

  TotalQuantity = 
    ((int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity)) ?? 0

如果您希望它默认为0。

发生这种情况的原因是,当没有详细信息时,Linq-to-SQL生成的SQL会导致数量列的空值。确定此问题与此类错误有关的一种简单方法是将db.Log设置为Console.Out并将生成的SQL复制到SSMS中并查看结果。您可能会看到生成的SQL创建了一个左连接,这会在Quantity列中产生一个或多个空值。要么是这样,要么会有一个子查询导致空值。

答案 1 :(得分:0)

除了customerOrders可能为null之外,我没有看到此异常。我错过了什么? 编辑:好的,我发现问题在于SelectMany运算符

问题可能是TotalQuantity不可为空。

答案 2 :(得分:0)

查询语法只是眼睛,并在编译期间被转换为扩展方法。此外,扩展方法更加强大,因为所有扩展方法都没有查询语法。您只需使用Enumerable.Join即可使用扩展方法执行连接。

但是我无法发现问题 - 我不希望你的代码导致异常。什么是实际的例外情况以及它发生在哪里?

答案 3 :(得分:0)

Quantity可以为空吗?我怀疑实际上异常发生的地方,因为所有其他情况应该只是一个空枚举,不会导致空异常。

异常细节肯定有帮助!