【问题标题】:Exception handling in Linq to SQL for customers without orders无订单客户的 Linq to SQL 异常处理
【发布时间】:2010-05-22 11:41:38
【问题描述】:

我有以下代码来检索客户姓名、总数(订单)、总和(订单详细信息),以便在 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) 
    });

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    我认为问题在于,在 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 列中产生一个或多个空值。要么这样,要么会有一个导致空值的子查询。

    【讨论】:

      【解决方案2】:

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

      但我无法发现问题 - 我不希望您的代码会导致异常。实际的异常是什么?它发生在哪里?

      【讨论】:

        【解决方案3】:

        我在这里看不到异常,除了 customerOrders 可能为空。我错过了什么? 编辑:好的,我看到问题出在 SelectMany 运算符上

        问题可能是 TotalQuantity 不可为空。

        【讨论】:

        • 不应有空引用,因为查询将被转换为 SQL 语句。 TotalQuantity 也应该没有问题。首先,无论如何都会推断出类型,其次,空序列的总和为零。
        【解决方案4】:

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

        异常细节肯定会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          • 2011-03-13
          相关资源
          最近更新 更多