鉴于LINQ to Entities不支持“自定义方法”,您如何保持DRY?

时间:2010-01-11 15:16:06

标签: linq-to-sql entity-framework linq-to-entities

我遇到了这个问题:

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

基本上我有一些复杂的LINQ查询,所以想把它们分解成子查询,这些子查询被实现为返回IQueryables的方法。我希望这些IQueryable可以在LINQ语句中组合在一起(因为我很确定你可以在LINQ to SQL中做到这一点)。

问题是如果你试试这个(例如):

  

LINQ to Entities无法识别   方法   “System.Linq.IQueryable`1 [线程]   GetThreadsByMostReccentlyPosted(的Int32)”   方法,这个方法不能   翻译成商店表达。

对我来说,如果你使用LINQ ORM,那么你需要能够编写LINQ查询。否则,任何常见的查询逻辑都必须是复制&粘贴。

鉴于这种限制,我如何使用LINQ to Entities保持DRY?

2 个答案:

答案 0 :(得分:12)

两种方式:

  1. 可以使用返回表达式的方法
  2. 分隔可查询和可枚举位
  3. 对于#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;
    

    这可能效率较低,或者可能没问题。这取决于你在做什么。它通常适用于预测,通常不适用于限制。

    更新刚看到Damien Guard的an even better explanation of option #1

答案 1 :(得分:0)

EF不能用包含方法的LINQ表达式组成查询。 EF需要文字值来组成SQL。

您将不得不使用“常见”查询来返回给定案例所需的实体的超集,然后使用扩展方法和LINQ来缩小从数据库返回的返回集。