2014-01-29 5 views
4

다양한 유형의 EF 엔터티가 있으며 모두 "Employee"라는 탐색 속성이 있습니다. 보고서를 생성 할 때 사용자는 다른 직원 사원 (코스트 센터, 성별 등)에 따라 보고서를 필터링 할 수있는 옵션을 갖습니다.Linq-EF 쿼리에 대한 일반적인 필터 방법

var courses = context.Courses 
       .Where(c => c.Employee.CostCenterID == ccID 
        && c.Employee.Rank == rankID 
        .... 
        ) 
        .ToList(); 

실제 필터 코드가 훨씬 더 긴하지만, 이것은 단지 힌트이었다

은 현재 내가 예를 들어, 개별적으로 각 쿼리를 필터링하고 있습니다. 어쨌든, 직원이 결과를 필터링하는 일반적인 방법을 만드는 방법이 있습니까? 이 필터 메소드에 제공 할 모든 엔티티에는 Employee 탐색 속성이 있습니다. IQueryable<entity> 또는 ObjectSet<entity>을 입력 한 다음 필터링 된 IQueryable<entity> 또는 ObjectSet<entity>을 입력하면됩니다.

어떻게 수행하나요?

답변

1

방금 ​​알아 냈습니다! 우리는 특정 속성에 대해 확인하는 일반적인 방법에 제약 조건을 추가 할 수 있기 때문에, 내가 인터페이스를 사용하여 수행 할 관리 : 그런 다음

public interface IFilterable 
{ 
    Employee Employee 
    { 
     get; 
     set; 
    } 
} 

을, 나는을 가지고 다른 기관에 대한 이전 인터페이스를 상속 할 부분 클래스를 추가 예를 들어 Employee 탐색 속성은 : 단순히 내가 그것을 사용할 수 있습니다 다음

public static IQueryable<T> Filter<T>(this IQueryable<T> source, SearchCriteria sc) 
    where T : class, IFilterable 
{ 
    var filtered = source.Where(e => e.Employee.CostCenterID == sc.CostCenterID 
     && e.Employee.Gender == sc.Gender); 

    return filtered; 
} 

:

public partial class Course: IFilterable 
{ 
} 

그런 다음 다음과 같은 일반적인 방법을 만들어

var list = context.Courses.Filter(sc).ToList(); 

주 : IFilterable을 상속하는 모든 클래스에서이 같은 SearchCriteria 다른 직원의 특성을 보유하고 단순한 클래스입니다.

더 나은 방법이 있다면 알려 주시기 바랍니다.

+0

난 당신이 http://codereview.stackexchange.com/에 질문으로이 코드를 작성하는 대신한다고 생각합니다 자신의 질문에 대답하고 더 나은 해결책을 묻습니다. –

+0

@ SergeyBerezovskiy 질문을 할 때 나는 대답을 모릅니다. 질문을 올린 후 그것을 알아 냈습니다. 그래서 저는 튜토리얼이나 다른 것을주는 것이 싫었습니다. 당신은 대답이 당신의 머리에서 갑자기 나타 났을 때 그 순간을 알고 있습니다 ... –

+1

어쨌든 @ SergeyBerezovskiy, 감사합니다. 또한 코드 검토에 게시했습니다. –

1

당신이 인터페이스를 구현하지 않도록하려면 다음

public Expression<Func<TEntity, bool>> EmployeeFilterDelegateExp<TEntity>( 
    int costCenterId, 
    int rankId) 
{ 
    var parm = Expression.Parameter(typeof(TEntity), "entity"); 
    var employeeProperty = Expression.Property(parm, "Employee"); 

    return (Expression<Func<TEntity, bool>>)Expression.Lambda(
     Expression.AndAlso(
      Expression.Equal(Expression.Property(employeeProperty, "CostCenterID"), 
       Expression.Constant(costCenterId)), 
      Expression.Equal(Expression.Property(employeeProperty, "Rank"), 
       Expression.Constant(rankId))), 
     parm); 
} 

사용법 :

var courses = context.Courses 
    .Where(EmployeeFilterDelegateExp<Course>(ccID, rankID)) 
    .ToList(); 
관련 문제