2010-01-02 246 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