28

コード:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);

エラー:

具体化された値が null であるため、値型 'Double' へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります。

私がすでに見たもの:

具体化された値が null であるため、値型 'Int32' へのキャストが失敗しました

具体化された値が null であるため、値型 'Decimal' へのキャストが失敗しました

私が試したこと:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .DefaultIfEmpty()
    .Sum(x => x.Quantity * x.Price);

と:

double? cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);

これらはどちらも機能しません。問題の原因は、渡した UserId の行がそのテーブルにないことだとわかっています。その場合、Sum() が 0 を返すことをお勧めします。何か案は?

4

8 に答える 8

70

最良の解決策

double cafeSales = db.InvoiceLines
                     .Where(x =>
                                x.UserId == user.UserId &&
                                x.DateCharged >= dateStart &&
                                x.DateCharged <= dateEnd)
                     .Sum(x => (double?)(x.Quantity * x.Price)) ?? 0;
于 2013-10-22T06:26:20.707 に答える
8

コレクションに正しい結果があるかどうかを確認できます。

double? cafeSales = null;
var invoices = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd
    )
    .Where(x => x.Quantity != null && x.Price != null);
if (invoices.Any()) {
    cafeSales = invoices.Sum(x => x.Quantity * x.Price);
}
于 2013-03-08T15:54:44.143 に答える
4

私はこれが少し古いことを知っていますが、念のために誰にも役立ちます。

@MattDefaultIFEmpty()適用する列のデフォルト値を渡す場合に備えて、メソッドが機能するはずですSum。このメソッドには、チェックしたいオーバーロードがいくつかあります。オーバーロードが要件をサポートしていない場合は、型キャストをお勧めします。

 (query).DefaultIfEmpty(0) 
于 2013-07-23T07:46:13.650 に答える
3

これでうまくいくはずです (QuantityまたはPriceが null 可能でない場合は、条件の 1 つを削除する必要があるかもしれません)。

var cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd &&
        x.Quantity != null &&
        x.Price != null);

double cafeSalesTotal = 0;

if (cafeSales.Any())
{
    cafeSalesTotal = cafeSales.Sum(x => x.Quantity * x.Price);
}
于 2013-03-08T15:59:17.723 に答える
1
join sim in ctx.EF.Collaterals on new { id = ini.cam.id, Type = 0 } equals new 
{ id = sim.CampaignId == null ? new Guid() : sim.CampaignId, sim.Type } 
into tempcoll
from sim in tempcoll.DefaultIfEmpty()

このソリューションは機能します。実際には、三項演算子を使用して値を確認し、2 番目の列と 2 番目のテーブルに null の場合は Guid を挿入する必要があります。機能します。「具体化された値がnullであるため、値型 'Double'へのキャストに失敗しました」は解決されます ありがとう

于 2016-02-11T07:06:05.080 に答える
0

上記の解決策は私にはうまくいきませんでした。私の問題は似ていました。行が返されていないことは確かでしたが、Sum は奇妙な動作をします。そのため、ラムダ式を呼び出す直前に、ラムダによって返される行のカウント プロパティをチェックするチェックを追加することにしました。ゼロより大きい場合は、合計式を呼び出します。それは私のために働いた。

于 2015-06-11T08:47:34.097 に答える
0
 var cafeSales = db.InvoiceLines
.Where(x =>
    x.UserId == user.UserId &&
    x.DateCharged >= dateStart &&
    x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);

double i;
if(cafeSales==null) ? i=0 : i=(double)cafeSales.First();
于 2013-03-08T15:56:14.530 に答える