EF永远需要生成此查询

dud*_*er4 10 linq performance entity-framework

我有一个父子表关系.在存储库中,我这样做:

return (from p in _ctx.Parents  
.Include( "Children" )  
select p).AsQueryable<Parent>();  
Run Code Online (Sandbox Code Playgroud)

然后在过滤器中,我想通过子ID列表过滤父项:

IQueryable<Parent> qry;  // from above
List<int> ids;  // huge list (8500)
var filtered =
from p in qry.Where( p => p.Children.Any(c => ids.Contains(c.ChildId)) ) select s;  
Run Code Online (Sandbox Code Playgroud)

我的ID列表很大.这会生成一个简单的SQL语句,它具有一个巨大的id"in(1,2,3 ...)"列表,但它本身不需要花费很多时间.然而,EF只需要整整一分钟来生成语句.我通过设置断点并调用来证明这一点:

((ObjectQuery<Parent>)filtered).ToTraceString();
Run Code Online (Sandbox Code Playgroud)

这需要所有的时间.这是我上一次linq声明中的问题吗?我不知道在(ids)中执行相当于Child.ChildId的任何其他方法.即使我的linq陈述不好,这个世界应该如何花这么长时间?

Nat*_*ugg 2

用 Lambda 语法重写您的查询,它会将时间缩短多达 3 秒(或者至少对我的 EF 项目来说是这样)。

return _ctx.Parents.Include( "Children" ).AsQueryable<Parent>();  
Run Code Online (Sandbox Code Playgroud)

IQueryable<Parent> qry;  // from above
List<int> ids;  // huge list (8500)
var filtered = qry.Where( p => p.Children.Any(c => ids.Contains(c.ChildId)) );
Run Code Online (Sandbox Code Playgroud)