代码之家  ›  专栏  ›  技术社区  ›  Jack Ukleja

如果linq-to-entities不支持“自定义方法”,如何保持干燥?

  •  8
  • Jack Ukleja  · 技术社区  · 15 年前

    我遇到了这个问题:

    Custom Methods & Extension Methods cannot be translated into a store expression

    基本上我有一些复杂的LINQ查询,所以希望将它们分解为子查询,这些子查询作为返回iqueryables的方法实现。我希望这些iqueryables可以组合在一个linq语句中(我非常肯定您可以在linq to sql中这样做)。

    问题是如果你尝试这个,你会得到(例如):

    Linq to实体无法识别 方法 'system.linq.iqueryable'1[线程] GetThreadsByMostRecentlyPosted(Int32)' 方法,而此方法不能 转换为存储表达式。

    在我看来,如果您使用LINQ ORM,那么您需要能够撰写LINQ查询,这是非常重要的。否则,必须复制和粘贴任何常见的查询逻辑。

    考虑到这一限制,我该如何在实体的Linq中保持干燥?

    2 回复  |  直到 15 年前
        1
  •  12
  •   Craig Stuntz    15 年前

    两种方式:

    1. 可使用返回表达式的方法
    2. 分离可查询和可枚举位

    对于1,考虑:

    public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator()
    {
        return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase);
    }
    
    public void DoStuff()
    {
        var exp = WhereCreatorIsAdministrator();
        using (var c = new MyEntities())
        {
            var q = c.Foos.Where(exp); // supported in L2E
            // do stuff
        }
     }
    

    有关数字2的示例,请阅读本文: How to compose L2O and L2E queries . 考虑下面给出的例子:

    var partialFilter = from p in ctx.People
                        where p.Address.City == “Sammamish”
                        select p;
    
    var possibleBuyers = from p in partiallyFilter.AsEnumerable()
                         where InMarketForAHouse(p);
                         select p;
    

    这可能会降低效率,或者可能会很好。这取决于你在做什么。它通常适合于预测,通常不适合限制。

    更新 刚刚看到 an even better explanation of option #1 来自达米安警卫。

        2
  •  0
  •   Dave Swersky    15 年前

    EF无法用包含方法的Linq表达式组成查询。ef需要文本值来组成SQL。

    您必须处理返回给定情况所需实体超集的“公共”查询,然后使用扩展方法和LINQ在从数据库返回返回返回集后缩小返回集的范围。