2010-01-02 206 views
0

直升机,实体框架V1,PredicateBuilder,LINQ到实体未能解决方法

我有下面的代码应筛选实体。一半的代码正在工作,我试图重构我的代码以获得某种“子过滤器”。

基本上我有以下调用来筛选用户实体集合:

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

WithGroups具有以下定义它的工作原理:

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; 
} 

我现在试图建立在一个过滤器将名为“WithNames”的实体分组,我可以在“WithGroups”内调用以获得更好的代码。它的定义是,像这样的时候直接调用它的工作原理:

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(); 

我已经试过这一个(和其他一些),这不起作用,因为LINQ到实体不知道“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; 
} 

也许有人可能会指点我一个解决方案。我没有更多的想法来找到解决这个问题的方法。

THX

回答

1

如果改变(或过载)您WithNamesWithGroups返回Expression<Func<Group, bool>>而不是IQueryable<Group>(同样地,对于Users,那么你可以使用这两者的内部调用Where。正如您所发现的, L2E不会解析(这本质上需要反编译)一种方法,但它可以处理Expression

+0

谢谢,这可行,但不适合我当前的存储库结构,因为它应该是某种类型的chainig WithXY返回IQueryable的方法,但我正在检查一个与ac有关的解决方案riteria对象。所以有人写了这样的查询:'repo.GetUsers(c => c.WithGroup(“Administrators”))。ToList()'Cirteria对象链表达式,所以我认为你的解决方案适合在那里。 – 2010-01-12 08:45:22