2014-11-04 8 views
0

의 나는 다음과 같은 클래스가있다 :필터 서브는-컬렉션 컬렉션

class Customer 
{ 
    public int IdCustomer {get; set} 
    public string Name {get; set;} 
    public virtual ICollection<Expertise> Expertises {get; set;} 
} 

class Expertise 
{ 
    public int IdExpertise {get; set;} 
    public string Description {get; set;} 
    public virtual ICollection<SubExpertise> SubExpertises {get; set;} 
} 

class SubExpertise 
{ 
    public int IdSubExpertise { get; set;} 
    public int IdExpertise {get; set;} 
    public string Description {get; set;} 
    public virtual Expertise Expertise {get; set;} 
} 

나는 된 IQueryable를 사용하여 SubExpertise 필터, 필터 상태를 유지할 수 있는가? 기본적으로 나는 SubExpertise에 의해 필터링 할,하지만 쿼리에

예를 더 필터를 추가하기 위해 사용되고 있습니다 유지 : 나는 SubExpertise 'X'또는 'y'를 가지고있는 모든 고객을 싶어요. SubExpertise는 컬렉션의 하위 모음 (전문 지식)입니다. 그리고 나서 나는 새 필터를 가질 수 있습니다. (당신이 그것을 이름을 변경한다)

bool IsXOrY(SubExpertise subExpertise) 
{ 
    check if the SubExpertise is 'x' or 'y' 
    check if the SubExpertise meets other criteria 
    return true if this SubExpertise meets all your criteria 
} 
+0

IQueryable 뒤에 무엇이 있습니까? Entity Framework에서 지원되는 조건이 필요합니까? – Mant101

+0

예. 기본적으로 인터페이스 (필터)에서 오는 많은 조건이 있으며 어떤 조건이 사용되는지 확인합니다. – GuFigueiredo

답변

1

나는 표현식을 동적으로 작성하는 방법을 알고 있다고 생각합니다. 조건부 빌더를 사용하여 작업을 수행 할 수 있습니다. 내 즐겨 찾기는 this one입니다.

이 작은 보석을 사용하여이 작업을 수행 할 수 있습니다

var pred = PredicateBuilder.Create<SubExpertise>(s => s.Description == "x"); 
pred = pred.Or(s => s.Description == "y"); 

var customers = db.Customers 
        .Where(c => c.Expertises 
           .Any(e => e.SubExpertises.AsQueryable() 
              .Any(pred))); 

e.SubExpertisesIQueryable으로 캐스팅해야이 컴파일시 타입 ICollection입니다, 그리고 ICollection에 맞는 확장 메서드 Any은 허용하지 않습니다 때문에 Expression하지만, a Func이므로 컴파일되지 않습니다.

-1

는 목록 당신은 IsXOrY의 모든 필터 조건을 추가 할 수 있습니다

var filteredCustomers = from customer in customers 
         where customer.Expertises.Any(e => e.Subexpertises.Any(s => IsXOrY(s))) 
         select customer; 

customers

있다고 가정 표현식으로 필터 정의

public static class SubExpertiseFilter 
{ 
    public static Expression<SubExpertise, bool> XorY = 
     se => se.Description == "X" || se.Description == "Y"; 

} 

그런 다음 적용하고자하는 경우 :

public IQueryable<Expertise> ApplyXorYFilter(IQueryable<Expertise> expertises, bool appyXorY) 
{ 
    if(applyXorY) 
    { 
     expertises = expertises.Any(e => e.Subexpertises.AsQueryable().Any(SubExpertiseFilter.XorY); 
    } 

    return expertises; 
} 

또는 필요한 곳에 인라인으로 처리하십시오.

"AsQueryable"은 다른 표현식에서 표현식을 사용하여 EF가 만족스럽게 사용할 수 있어야합니다. 그렇지 않으면 컴파일러에서 EF가 SQL로 변환 할 수있는 기능이 아닌 것으로 기대합니다.

+0

EF LINQ 쿼리와 함께 실행되지 않습니다. 그것은 IsXOrY가 SQL로 변환 될 수 없다고 불평 할 것이다. –

0

내가 resuable 필터에 대해이 같은 패턴을 사용 :