【发布时间】:2010-08-17 15:48:26
【问题描述】:
我有一个父子表关系。在存储库中,我正在这样做:
return (from p in _ctx.Parents
.Include( "Children" )
select p).AsQueryable<Parent>();
然后在过滤器中,我想通过子 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;
我的 id 列表非常庞大。这会生成一个简单的 SQL 语句,它确实有一个巨大的 id 列表“in (1,2,3...)”,但它自己运行并不需要太多时间。然而,EF 只需要一整分钟来生成语句。我通过设置断点并调用来证明这一点:
((ObjectQuery<Parent>)filtered).ToTraceString();
这需要所有时间。问题出在我最后的 linq 语句中吗?我不知道在(ids)中做相当于 Child.ChildId 的任何其他方法。即使我的 linq 语句很糟糕,这到底怎么会花这么长时间?
【问题讨论】:
-
发布你的架构和生成的sql,你可能会得到更多帮助。
-
架构似乎无关紧要,父/子关系也不重要。仅从具有大列表的单个表/实体中进行选择时也会出现同样的问题。
-
对于遇到问题的其他人;据我所知,EF4 没有解决方案。您必须求助于存储过程。更多信息:social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/…
标签: linq performance entity-framework