【发布时间】:2010-01-02 19:41:48
【问题描述】:
直升机,
我有以下代码应该过滤实体。一半的代码正在工作,我试图重构我的代码以获得某种“子过滤器”。
基本上我有以下调用来过滤用户实体集合:
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”的 Groups 实体上创建一个过滤器,我可以在“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 to Entities 不知道“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;
}
也许有人会指出我的解决方案。我没有更多的想法来解决这个问题。
谢谢
【问题讨论】:
标签: c# entity-framework linq-to-entities