5

これが問題のクエリです

return _projectDetail.ExpenditureDetails
    .Where(detail => detail.ProgramFund == _programFund
         && detail.Expenditure.User == _creditCardHolder)
    .Sum(detail => detail.ExpenditureAmounts.FirstOrDefault(
        amount => amount.isCurrent && !amount.requiresAudit)
    .CommittedMonthlyRecord.ProjectedEac);

テーブル構造
ProjectDetails (1 から多数) ExpenditureDetails
ExpenditureDetails (1 から多数) ExpenditureAmounts
ExpenditureAmounts (1 から 1) CommittedMonthlyRecords

ProjectedEac は、CommittedMonthlyRecords の 10 進数フィールドです。

単体テストで発見した問題 (ありそうもないイベントですが)、次の行が null になる可能性があります。

detail.ExpenditureAmounts.FirstOrDefault(
    amount => amount.isCurrent && !amount.requiresAudit)

私の元のクエリはネストされたループで、データベースに何度もアクセスすることになり、繰り返したくありませんでした。ここでいくつかの同様の質問のように思われるものを調べましたが、解決策が合わないようでした.

何か案は?

4

1 に答える 1

3

ヌルをチェックしないのはなぜですか?

return _projectDetail.ExpenditureDetails.Where(detail => 
        detail.ProgramFund == _programFund && 
        detail.Expenditure.User == _creditCardHolder
    ).Sum(detail => {
        var a = detail.ExpenditureAmounts.FirstOrDefault(
            amount => amount.isCurrent && !amount.requiresAudit
        );
        return a != null ? a.CommittedMonthlyRecord.ProjectedEac : 0.0m;
    });
于 2010-05-04T22:42:06.397 に答える