我有以下代码来检索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)
});
答案 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
可以为空吗?我怀疑实际上异常发生的地方,因为所有其他情况应该只是一个空枚举,不会导致空异常。
异常细节肯定有帮助!