我遇到了这个问题:
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?
答案 0 :(得分:12)
两种方式:
对于#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来缩小从数据库返回的返回集。