【发布时间】:2012-12-15 03:35:51
【问题描述】:
我有一个存储库,其中多个方法在谓词中使用相同的逻辑。
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 作为参数,然后返回一个用于调用 lambda 表达式的表达式,有点像表达式工厂方法即:
public Expression IsLoanInvalid(Loan l);
有谁知道这是否会克服 EF 无法理解方法调用的问题,或者我应该创建一个自定义 ExpressionVisitor 还是我应该尝试其他解决方案?
另外,如果上述建议的解决方案是可能的并且我走这条路,我该如何构建一个表达式树以便它使用传入的参数?我已经成功地实现了构建表达式的方法,但迄今为止未能成功将 Loan 参数传递给我正在构建的表达式以返回给调用代码。提前谢谢你。
【问题讨论】:
标签: linq entity-framework expression-trees