1

いくつかのメソッドが述語内で同じロジックを使用しているリポジトリがあります。

public IList<Loan> GetLoansByCommitmentID(int commitmentID)
{

    var query = this.context.Loans.Where(l => l.CommitmentLoan != null &&
                                         l.CommitmentLoan.CommitmentID == commitmentID && 
                                         (l.LoanStatusTypes == null || (l.LoanStatusTypes.Description != "Invalid")));

    return query.ToList();
}

上記のコードでは、括弧で囲まれた最後の部分式です。

(l.loanStatusTypes == null || (l.LoanStatusTypes.Description != "Invalid"))

この部分をリポジトリのプライベート メソッドに移動して、この場合は Loan を受け取り、ブール値に評価されるようにしたいと思います。ただし、このロジックをメソッドに移動すると、EF はメソッド呼び出しを評価する方法を理解できません。少し考えた後、おそらくこれを行う正しい方法は、プライベート リポジトリ メソッドが Loan をパラメーターとして受け取り、呼び出し側のラムダ式で使用される Expression を返すことであると判断しました。これは Expression factory のようなものです。メソッドすなわち:

public Expression IsLoanInvalid(Loan l);

これがEFがメソッド呼び出しを理解できないことを克服するかどうか、または代わりにカスタムExpressionVisitorを作成する必要があるか、それとも私が試すべき別の解決策があるかを誰かが知っていますか?

また、上記の提案された解決策が可能であり、このルートに進む場合、渡されたパラメーターを使用するように式ツリーを構築するにはどうすればよいですか? 式を作成するメソッドを正常に実装しましたが、これまでのところ、作成中の Expression に Loan パラメータを渡して呼び出し元のコードに返すことができませんでした。前もって感謝します。

4

1 に答える 1

1

where述語のその部分を保持する変数を作成できます。

public Expression<Func<Loan, bool>> LoanStatus = loan => loan.LoanStatusTypes == null || loan.LoanStatusTypes.Description != "Invalid";

そして、あなたのIQueriableから離れた場所に1秒追加します

public IList<Loan> GetLoansByCommitmentID(int commitmentID)
{    
    var query = this.context.Loans
         .Where(l => l.CommitmentLoan != null && l.CommitmentLoan.CommitmentID == commitmentID)
         .Where(LoanStatus);

    return query.ToList();
}
于 2012-12-14T19:35:51.537 に答える