2010-01-02 1 views
0

힐로,엔티티 프레임 워크 V1은 엔티티에 PredicateBuilder, Linq에이 방법을

내가 개체를 필터링해야 다음 코드를 해결하지 못했습니다. 코드의 절반은 일종의 '서브 필터'를 얻기 위해 코드를 리팩터링하려고합니다.

public static IQueryable<User> WithGroups(this IQueryable<User> users, params string[] groups) 
{ 
    if (groups != null && groups.Length > 0) 
    { 

     var outer = PredicateBuilder.True<User>(); 
     var inner = PredicateBuilder.False<Group>(); 
     foreach (string group in groups) 
     { 
      string g1 = group; 
      inner = inner.Or(g => g.Name == g1); 
     } 
     outer = outer.And(u => u.Groups.Where(inner.Compile()).Any()); 
     users = users.Where(outer);    
    } 
    return users; 
} 

내가 지금에 필터를 만들려고 해요 :

var result = ctx.GetUsers().WithGroups("Administrators","Users").ToList(); 

WithGroups 작동 다음과 같이 정의되어있다 :

는 기본적으로 나는 사용자 개체 모음을 필터링하려면 다음 호출을 "WithGroups"내에서 호출하여 더 나은 코드를 얻을 수있는 "WithNames"라는 엔티티를 그룹화합니다.

public static IQueryable<User> WithGroups(this IQueryable<User> users, params string[] groups) 
{ 
    if (groups != null && groups.Length > 0) 
    { 
     var inner = PredicateBuilder.False<User>(); 
     inner = inner.And(u => u.Groups.AsQueryable().AsExpandable().WithNames(groups).Any()); 
     users = users.Where(inner.Expand()); 
    } 
    returnh users; 
} 
"WithNames"을 모르는 Linq에 있기 때문에 엔티티에 작동하지 않는

public static IQueryable<Group> WithNames(this IQueryable<Group> groups, params string[] names) 
{ 
    if (names != null && names.Length > 0) 
    { 
     var outer = PredicateBuilder.True<Group>(); 
     var inner = PredicateBuilder.False<Group>(); 
     foreach (var name in names) 
     { 
      string _n = name; 
      inner = inner.Or(g => g.Name == _n); 
     } 
     groups = groups.Where(outer.And(inner.Expand())); 
    } 
    return groups; 
} 

var test = ctx.GetGroups().WithNames("Administrators").ToList(); 

내가 이것 (그리고 몇몇 다른 사람을) 시도 : 직접 호출 할 때, 어떤 작품과 같이 정의된다

아마도 누군가 나를 해결할 수 있습니다. 이 문제를 해결할 방법을 찾을 수있는 더 이상 아이디어가 없습니다.

들으

답변

1

당신이 Expression<Func<Group, bool>> 대신 IQueryable<Group>을 (유사 Users을 위해, 당신은 둘 다 내부 Where 호출을 사용할 수 있습니다. 당신이 발견 한으로 돌아가려면 WithNamesWithGroups (또는 과부하)를 변경하는 경우, L2E는 (본질적으로 그것을 디 컴파일해야 함) 메소드를 구문 분석하지 않지만 Expression을 처리 할 수 ​​있습니다.

+0

감사합니다. 작동하지만 현재 저장소 구조에 맞지 않습니다. WithXY 메서드를 IQueryable 반환합니다.하지만 ac와 함께 작동하는 솔루션을 확인 해요. riteria 개체입니다. 그래서 다음과 같은 쿼리를 작성합니다 :'repo.GetUsers (c => c.WithGroup ("Administrators")) .ToList()'Cirteria 객체는 표현식을 연결합니다. –