【发布时间】:2014-11-07 20:38:24
【问题描述】:
我有一组报告,我需要在返回输出之前对其执行过滤。我想使用一个匿名方法来执行此操作,以避免在不同的存储库中复制相同的代码。我使用的是实体框架,所以模型类型都与数据库相关,并继承自一个名为 ReportBase 的基类。
这就是我目前实现过滤的方式,每种报表类型都必须使用不同的上下文实现此方法并返回不同的 IQueryable 类型。
private IQueryable<ReviewAgreement> GetFiltered(ReportFilter filter)
{
IQueryable<ReviewAgreement> reviewAgreementQueryable = Context.ReviewAgreements.Where(p => p.ClientWorkflowId == filter.ClientWorkflowId);
if (filter.AppraisalLevelId.HasValue)
{
reviewAgreementQueryable = reviewAgreementQueryable.Where(p => p.AppraisalLevelId == filter.AppraisalLevelId.Value);
}
return reviewAgreementQueryable;
}
我一直在尝试匿名实现它,以便我可以重复使用它,就像在这个非功能示例中一样。
public IQueryable<T> GetFiltered(ReportFilter filter)
{
IQueryable<T> reportQueryable = Context.Set<T>();
reportQueryable = reportQueryable.Where(p => p.ClientWorkflowId == filter.ClientWorkflowId);
if (filter.AppraisalLevelId.HasValue)
{
reportQueryable = reportQueryable.Where(p => p.AppraisalLevelId == filter.AppraisalLevelId.Value);
}
return reportQueryable;
}
我遇到的问题当然是Where 的使用不明确,所以无法解析p.ClientWorkflowId。
我曾尝试使用 Func<T, TResult> 委托来传递过滤选项,但 Where 操作似乎想要返回一个列表。
真的有什么方法可以达到我想要的效果吗?
【问题讨论】:
-
ClientWorkflowId在哪里定义?它是在ReportBase上定义的,还是您的实体都单独定义ClientWorkflowId?AppraisalLevelId呢?此外,您尝试将过滤器作为Func<T, bool>传递可能会失败,因为Queryable.Where需要Expression<Func<T, bool>>。 -
我放的例子是一个经过大量修剪的版本,我实际上是通过很多属性过滤的。但是,是的,它们都是在 ReportBase 上定义的。所有其他模型都继承了它。
标签: c# entity-framework iqueryable anonymous-types