0

LINQ クエリが 1 つあります。その中で、いくつかの計算を行う必要があります。いずれかの条件でnull値が見つかった場合を除いて、すべて問題ありません。条件全体に対してnullを返すだけです。条件に null 値が見つかった場合でも、値を返す方法を教えてください。

コード

var model = 
   (from q in db.Porders
    select new porders()
    {
        Id = q.Id,
        DetCount = (from amtdet in db.PoDetails 
                    where amtdet.PoId == q.Id 
                    select amtdet.Id).Count(),
        Amount = (from amtpord in db.Porders 
                  where amtpord.Id == q.Id 
                  select amtpord.Freight + amtpord.Misc - amtpord.Discount
                 ).FirstOrDefault() +
                  (from amtdet in db.PoDetails 
                   where amtdet.PoId == q.Id 
                   select amtdet.Copies * amtdet.EstUnitPrice
                  ).Sum()
     }).ToList();
4

3 に答える 3

0

Null 許容列または結果に合体column ?? 0演算子を適用してみてくださいFirstOrDefault(条件が満たされない場合)。エンティティへの Linq は、この演算子を SQL に変換します。

CASE WHEN Column IS NOT NULL THEN Column ELSE 0 END

次のようになります。

var model = 
   (from q in db.Porders
    select new porders()
    {
        Id = q.Id,
        Amount = (from amtpord in db.Porders 
                  where amtpord.Id == q.Id 
                  select amtpord.Freight ?? 0 + amtpord.Misc ?? 0 - amtpord.Discount ?? 0
                 ).FirstOrDefault() ?? 0 +
                  (from amtdet in db.PoDetails 
                   where amtdet.PoId == q.Id 
                   select amtdet.Copies ?? 0 * amtdet.EstUnitPrice ?? 0
                  ).Sum() ?? 0
     }).ToList();
于 2013-01-29T12:35:50.963 に答える
0

まず、ナビゲーション プロパティがあると仮定しますPorder.Details。次に、サブクエリで同じものを選択するのはなぜPorderですか? あなたのクエリは次のように単純化できるようです

from q in db.Porders
    select new porders()
    {
        Id = q.Id,
        DetCount = q.Details.Count(),
        Amount = q.Freight + q.Misc - q.Discount
               + q.PoDetails.Select( d => d.Copies * d.EstUnitPrice)
                  .DefaultIfEmpty().Sum()
    }

そのようなナビゲーション プロパティがない場合は、作成することを強くお勧めします。なんらかの理由でそれができない、またはしたくない場合は、メイン クエリで詳細レコードをグループ結合する必要があります ( db.Porders.GroupJoin(db.PoDetails...))。

null 値が によって引き起こされるかFreight、 null 可能である場合は、 operator:を使用します。MiscDiscount??q.Freight ?? 0

于 2013-01-29T13:20:51.977 に答える
0

DefaultIfEmpty()メソッドはここでの解決策になると思います

var model =
    from q in db.Porders
    select new porders()
    {
        DetCount = 
            db.PoDetails.Count(amtdet => amtdet.PoId == q.Id),
        Amount = 
            (from amtpord in db.Porders
            where amtpord.Id == q.Id
            select amtpord.Freight + amtpord.Misc - amtpord.Discount)
            .DefaultIfEmpty().First()
            +
            (from amtdet in db.PoDetails
            where amtdet.PoId == q.Id
            select amtdet.Copies * amtdet.EstUnitPrice)
            .DefaultIfEmpty().Sum()
    }
于 2013-01-29T09:49:51.157 に答える