【问题标题】:How do I build a repository method that builds an Expression using a passed in parameter?如何构建使用传入参数构建表达式的存储库方法?
【发布时间】: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


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多