2017-05-16 11 views
8

데이터베이스에서 올바른 IQueryable<Project>을 리턴하는 Expression<Func<Project, bool>> 유형의 표현식을 빌드 중입니다. IQueryable<Project>에는 SubProjects의 중첩 컬렉션이 있으며 필터도 마찬가지입니다. 이것은 다음과 같습니다.IQueryable의 중첩 항목을 필터링하려면 어떻게해야합니까? <T>?

데이터베이스를 한 번 호출하면됩니다. 예를 들어

: 나는이에 Expression<Func<SubProject, bool>>을 추가 할 수있는 방법

Expression<Func<Project, bool>> projectFilter = FilterEnabled(); 

projectFilter = projectFilter.And(GetProjectsByOrganization()) 
          .And(GetSubProjectsByStartDate()); 

var projectData = GetProjectsAsQueryable(projectFilter); //returns correct projects and the filtered sub projects by start date 

public Expression<Func<Project, bool>> GetProjectByOrganization() 
{ 
    var organizationIDs = new List<Guid>(); 

    if (FilterCriteria.OrganiazaitonId != null) 
     organizationIDs = OrganizationRepository.GetParentAndChildrenOrganizationIds(FilterCriteria.OrganiazaitonId.Value).ToList(); 

    //... 

    return prj => FilterCriteria.OrganiazaitonId == null || organizationIDs.Contains(prj.OrganizationID.Value); 
} 

다음에 나오는 GetProjectsByOrganization가 될 때 :

Expression<Func<Project, bool>> projectFilter = FilterEnabled(); 

projectFilter = projectFilter.And(GetProjectsByOrganization()); 

var projectData = GetProjectsAsQueryable(projectFilter); //returns correct projects 

이 내가하고 싶은 것입니다 필터? 내가 가진 대안이 없다면?

답변

10

Expression.AndAlso을 사용하면 3 개의 표현식 모두를 새로운 것으로 결합 할 수 있습니다. Expression.PropertyOrField하면 하위 프로젝트 대신 매개 변수로 프로젝트를 전달할 수 있습니다

static Expression<Func<Project, bool>> CombineFilterExpression(
     Expression<Func<Project, bool>> firstProjectFilter, 
     Expression<Func<Project, bool>> secondProjectFilter, 
     Expression<Func<SubProject, bool>> subProjectFilter 
    ) 
    { 
     //Create Project Parameter 
     var param = Expression.Parameter(typeof(Project)); 
     //Create && Expression 
     var body = Expression.AndAlso(
      Expression.Invoke(firstProjectFilter, param), 
      Expression.AndAlso(//Create second && Expression 
       Expression.Invoke(secondProjectFilter, param), 
       //Pass SubProject instead of Project 
       Expression.Invoke(subProjectFilter, Expression.PropertyOrField(param, nameof(Project.SubProject))) 
      ) 
     ); 
     //Make Lambda with Project parameter 
     return Expression.Lambda<Func<Project, bool>>(body, param); 
    } 
+1

Johnny5 나는 아직 그것을 시도하지 않은 @ 나는이 EntityFramework –

+0

함께 작동합니다 생각하지 않지만 그 이유는 무엇입니까? 그것을 할 다른 방법이 있습니까? –