9

私はあちこちでこの質問のバリエーションを見てきましたが、答えはどれも私にはうまくいきません。それらのほとんどは、単一の列を合計しようとしているだけです。以下のような積の合計のように、これ以上複雑なものはありません。

public double Total

    {
        get
        {
            return _Context.Sales.Where(t => t.Quantity > 0)
                .DefaultIfEmpty()
                .Sum(t => t.Quantity * t.Price);                 
        }
    }

行が返されない場合は、ゼロを返します。ただし、行が返されない場合、.Sum()は失敗します。Convert.ToDoubleを挿入しようとしたり、null合体演算子を使用したりするためのさまざまなオプションがありますが、それでもエラーが発生しました。

私はこれを行うための簡単な方法を見逃していると確信しています-グーグルのレンガの壁に頭をぶつけすぎた後、どんな助けでも大いに感謝します!

4

1 に答える 1

14

DefaultIfEmpty()演算子を削除します。Sum結果をnull許容型にキャストします。次に、null合体演算子を使用して、クエリが返された場合にデフォルト値を返しますnull

public double Total    
{
   get
   {
       return _Context.Sales
                      .Where(t => t.Quantity > 0)
                      .Sum(t => (double?)(t.Quantity * t.Price)) ?? 0; 
   }
}

生成されたSQLは次のようになります。

SELECT SUM([Filter1].[A1]) FROM 
(SELECT CAST(CAST([Extent1].[Quantity] AS decimal(19,0)) * 
                  [Extent1].[Price] AS float) AS [A1]
 FROM [dbo].[Sales] AS [Extent1]
 WHERE [Extent1].[Quantity] > 0) AS Filter1
于 2012-11-25T10:15:22.323 に答える