2012-12-14 38 views
1

我有一個存儲庫,其中幾個方法在謂詞中使用相同的邏輯。如何構建使用傳入參數構建Expression的存儲庫方法?

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")) 

我想,這樣只有在貸款給這片移動到庫中的一個私有方法,在這種情況下, ,並評估爲布爾值。但是,如果將此邏輯移入方法中,EF不理解如何評估方法調用。因此,在思考了一下之後,我決定或許正確的做法是讓私有存儲庫方法將Loan作爲參數,然後返回一個用於調用lambda表達式的Expression,類似於Expression工廠方法即:

public Expression IsLoanInvalid(Loan l); 

有誰知道這是否會克服EF的無法理解方法調用或者我應該改爲創建自定義ExpressionVisitor或有另一種解決方案,我應該嘗試?

此外,如果上述建議的解決方案是可能的,我走這條路線,我該如何建立一個表達式樹,以便它使用傳入的參數?我已經成功地實現了一個構建表達式的方法,但是迄今爲止還沒有成功將Loan參數傳遞給構建的表達式以返回到調用代碼。先謝謝你。

回答

1

你可以創建一個變量來容納你的where謂詞。

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

,然後添加第二個地方開始你的IQueriable

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(); 
} 
+0

也非常完美,非常感謝! – Rawlins

相關問題