5

次のLINQtoSQLクエリがあります。

var inTransitStocks = orderHistories.Where(oh => oh.Shipped_Qty > 0)
                                    .Select(oh => oh.Shipped_Qty); //.ToList();
var inTransitStock = (int)inTransitStocks.Sum();

電話をかけないと、次の行ToListで例外が発生します。Sum()

ヌル値は、ヌル不可能な値タイプであるSystem.Doubleタイプのメンバーに割り当てることはできません。

(コメントに示されているように)前の合計を追加して.ToList()も、エラーは発生しません。

そもそもなぜエラーが発生するのですか?Shipped_Qtynullではなく、そのフィールドの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))

結果は返されません。

4

3 に答える 3

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 と NOTnullです。

つまり、基本的には、異なるセマンティクスは異なる結果につながります。

于 2012-09-05T07:30:31.640 に答える
0

を行った後ToList()、Linq-To-Objects の実装を使用していますSum

操作を行う前にToList()SumLinq-To-Sql クエリに集約されます。


Linq-To-Sql が失敗する理由を調べるには、Daniel Hilgath のアプローチに従ってください。

于 2012-09-05T07:31:53.230 に答える
0

すべてが言われましたが、再定式化させてください: これは var の魔法によるものです!

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

Sum 関数は、2 つの型で同じ動作をしません...

于 2012-09-05T07:40:25.743 に答える