代码之家  ›  专栏  ›  技术社区  ›  stackoverflowuser

无订单客户的Linq to SQL异常处理

  •  1
  • stackoverflowuser  · 技术社区  · 15 年前

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

    我知道使用查询语法(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 回复  |  直到 15 年前
        1
  •  3
  •   Devid G    15 年前

    我认为问题在于,在SQL中,sum函数可以返回空值,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为Quantity列生成的SQL将导致空值。确定这种错误的一个简单方法是将db.log设置为console.out并将生成的SQL复制到ssms中,然后查看结果。您很可能会看到生成的SQL创建了一个左联接,从而在Quantity列中产生一个或多个空值。否则将有一个子查询产生空值。

        2
  •  0
  •   Daniel Brückner    15 年前

    查询语法只是一个眼花缭乱的东西,在编译期间被转换成扩展方法。此外,扩展方法更加强大,因为所有扩展方法都没有查询语法。你可以用 Enumerable.Join 使用扩展方法执行联接。

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

        3
  •  0
  •   VoodooChild    15 年前

    我在这里没有看到异常,除非客户机可以为空。我错过了什么? 编辑:好的,我发现selectmany运算符有问题。

    问题可能是totalQuantity不可为空。

        4
  •  0
  •   Ian Mercer    15 年前

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

    异常详细信息当然会有帮助!