我遇到过这个问题:
Custom Methods & Extension Methods cannot be translated into a store expression
基本上我有一些复杂的LINQ查询,所以想要将它们分解为子查询,这些子查询被实现为返回IQueryables的方法.我希望这些IQueryable可以在LINQ语句中组合在一起(因为我很确定你可以在LINQ to sql中做到).
问题是如果你试试这个(例如):
LINQ to Entities does not recognize
the method
‘System.Linq.IQueryable`1[Thread]
GetThreadsByMostReccentlyPosted(Int32)’
method,and this method cannot be
translated into a store expression.
对我来说,如果你使用LINQ ORM,那么你需要能够编写LINQ查询.否则,任何常见的查询逻辑都必须是copy&粘贴.
鉴于这种限制,我怎么能用LINQ to Entities保持DRY?
解决方法
两种方式:
对于#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.