簡體   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