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