출력을 반환하기 전에 필터링을 수행해야하는 보고서 집합이 있습니다. 다른 리포지토리에서 동일한 코드를 복제하지 않으려면 단일 익명 메서드로이 작업을 수행하고 싶습니다. Entity Framework를 사용하여 모델 유형이 모두 데이터베이스와 관련이 있고 기본 클래스 인 ReportBase
에서 상속됩니다.익명 형식의 필터링 된 IQueryable <T>을 반환합니다.
이것은 현재 필터링을 구현하는 방법이며, 각 보고서 유형은이 컨텍스트를 사용하여이 메서드를 구현하고 다른 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'는 어떻습니까? 또한, 'Query>'을 기대하기 때문에 'Func '으로 필터를 전달하려는 시도가 실패했을 수 있습니다. –
내가 넣은 예제는 많은 특성으로 실제로 필터링하고있는 다듬어 진 버전입니다. 하지만 그렇습니다. 모두 ReportBase에서 정의됩니다. 다른 모든 모델이 상속하는 모델. – Amicable