Geo*_*ett 5 c# linq null exception-handling linq-to-sql
我有以下LINQ to SQL查询:
var inTransitStocks = orderHistories.Where(oh => oh.Shipped_Qty > 0)
.Select(oh => oh.Shipped_Qty); //.ToList();
var inTransitStock = (int)inTransitStocks.Sum();
Run Code Online (Sandbox Code Playgroud)
没有ToList电话,我在下面就得到了例外情况Sum():
无法将null值分配给类型为System.Double的成员,该成员是非可空值类型.
如果我添加一个.ToList()之前的总和(如评论中所示)我没有得到错误.
为什么我首先得到错误?(Shipped_Qty不是null,并且db中不存在该字段中的空数据)
为什么要添加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))
Run Code Online (Sandbox Code Playgroud)
没有返回结果.
原因如下:
没有ToList以下查询对数据库执行:
select SUM(Shipped_Qty) from orderHistories where Shipped_Qty > 0;
Run Code Online (Sandbox Code Playgroud)
如果没有符合此条件的行,则此查询的结果不是0 NULL.
随着ToList下面的查询被执行:
select Shipped_Qty from orderHistories where Shipped_Qty > 0;
Run Code Online (Sandbox Code Playgroud)
结果(没有行)将被放入列表中.结果是一个空列表.在该空列表中,您执行LINQ to Objects扩展方法Sum.空列表的总和为0而不是null.
所以基本上:不同的语义会导致不同的结果.