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
謝謝,這可行,但不適合我當前的存儲庫結構,因爲它應該是某種類型的chainig WithXY返回IQueryable的方法,但我正在檢查一個與ac有關的解決方案riteria對象。所以有人寫了這樣的查詢:'repo.GetUsers(c => c.WithGroup(「Administrators」))。ToList()'Cirteria對象鏈表達式,所以我認爲你的解決方案適合在那裏。 – 2010-01-12 08:45:22