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

Jac*_*eja 8 linq-to-entities entity-framework linq-to-sql

我遇到过这个问题:

自定义方法和扩展方法无法转换为商店表达式

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

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

LINQ to Entities无法识别方法'System.Linq.IQueryable`1 [Thread] GetThreadsByMostReccentlyPosted(Int32)'方法,并且此方法无法转换为商店表达式.

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

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

Cra*_*ntz 12

两种方式:

  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
    }
 }
Run Code Online (Sandbox Code Playgroud)

有关数字2的示例,请阅读以下文章:如何编写L2O和L2E查询.考虑那里给出的例子:

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;
Run Code Online (Sandbox Code Playgroud)

这可能效率较低,也可能没问题.这取决于你在做什么.投影通常很好,通常不适合限制.

更新刚看到Damien Guard 对选项#1的更好解释.