繁体   English   中英

LINQ to SQL和null值

[英]LINQ to SQL and null values

我有以下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的成员,该成员是非可空值类型。

如果我在sum之前添加.ToList() (如注释中所示),我不会收到错误。

为什么我首先得到错误? Shipped_Qty不为null,并且该字段中不存在空数据)

为什么要添加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))

没有返回结果。

原因如下:

如果没有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

所以基本上:不同的语义会导致不同的结果。

在执行ToList()您正在使用Sum的Linq-To-Objects实现。

在执行ToList()之前, Sum操作正在聚合到Linq-To-Sql查询中。


要找出Linq-To-Sql失败的原因,请遵循Daniel Hilgath的方法

所有人都说,但让我重新表述:这是因为var的魔力!

Without ToList() var <=> DbQuery
With ToList() var <=> List<Double>

Sum函数在两种类型上没有相同的行为......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM