【问题标题】:Entity Framework V1, PredicateBuilder, Linq to Entities failed to resolve methodEntity Framework V1、PredicateBuilder、Linq to Entities 解析方法失败
【发布时间】: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


    【解决方案1】:

    如果您更改(或重载)WithNamesWithGroups 以返回 Expression&lt;Func&lt;Group, bool&gt;&gt; 而不是 IQueryable&lt;Group&gt;(对于 Users 也是如此,那么您可以在对 Where 的调用中使用它们。正如您所发现的,L2E 不会解析(这基本上需要对其进行反编译)方法,但它可以处理 Expression

    【讨论】:

    • 谢谢,这可行,但不适合我当前的存储库结构,因为它应该是某种返回 IQueryable 的 chainig WithXY 方法。但我正在检查一个使用标准对象的解决方案。所以写一个这样的查询:repo.GetUsers(c =&gt; c.WithGroup("Administrators")).ToList() Cirteria 对象链表达式,所以我认为你的解决方案适合在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多