我有以下LINQ to SQL查询:
var inTransitStocks = orderHistories.Where(oh => oh.Shipped_Qty > 0)
.Select(oh => oh.Shipped_Qty); //.ToList();
var inTransitStock = (int)inTransitStocks.Sum();
如果没有ToList
来电,我会在Sum()
行上获得以下例外:
无法将null值分配给System.Double类型的成员,该类型是非可空值类型。
如果我在求和之前添加.ToList()
(如评论中所示),我不会收到错误。
为什么我首先得到错误?(Shipped_Qty
不为空且数据库中不存在该字段中的空数据)
为什么要添加ToList()
修复程序?
执行的sql查询如下(查询比上面的更多):
SELECT [t0].[Shipped Qty]
FROM [dbo].[Order History] AS [t0]
WHERE ([t0].[Shipped Qty] > @p0) AND ([t0].[CUST_ID] = @p1) AND ([t0].[SHIP_TO_ID] = @p2) AND ([t0].[Item] = @p3) AND (([t0].[DT_LST_SHP] >= @p4) OR (UNICODE([t0].[LN_STA]) = @p5))
不会返回任何结果。
答案 0 :(得分:6)
原因如下:
如果没有ToList
,则会对数据库执行以下查询:
select SUM(Shipped_Qty) from orderHistories where Shipped_Qty > 0;
如果没有符合此条件的行,则此查询的结果不是0,而是NULL
。
使用ToList
执行以下查询:
select Shipped_Qty from orderHistories where Shipped_Qty > 0;
结果(无行)将被放入列表中。结果是一个空列表。在该空列表中,您执行LINQ to Objects扩展方法Sum
。空列表的总和为0而不是null
。
基本上:不同的语义会导致不同的结果。
答案 1 :(得分:0)
执行ToList()
后,您正在使用Sum
的Linq-To-Objects实现。
在执行ToList()
之前,Sum
操作正在聚合到Linq-To-Sql查询中。
要了解Linq-To-Sql失败的原因,请按Daniel Hilgath's approach。
答案 2 :(得分:0)
所有人都说了,但让我重新表述:这是因为var的魔力!
Without ToList() var <=> DbQuery
With ToList() var <=> List<Double>
Sum函数在两种类型上没有相同的行为...