我有一個父子表關係。在倉庫,我這樣做:EF永久生成此查詢
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列表(「(1,2,3 ...)」),但它本身不需要可觀的時間運行。然而,EF只需要大約一分鐘時間來生成聲明。我通過設置斷點和呼叫證明了這一點:
((ObjectQuery<Parent>)filtered).ToTraceString();
這需要所有的時間。在我最後的linq聲明中是否存在問題?我不知道有任何其他方式可以完成(ids)中的Child.ChildId。即使我的linq聲明不好,世界上該怎麼走這麼久?
發佈你的模式和生成的sql,你可能會得到更多的幫助。 – 2010-08-17 16:32:03
模式似乎並不重要,父母/子女關係也不重要。同樣的問題只是從一個大型列表中選擇一個表/實體。 – dudeNumber4 2010-08-19 15:15:58
對於遇到問題的任何人;從我能說的一切來看,EF4沒有解決方案。您必須訴諸存儲過程。更多信息:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d629c798-db45-4a04-9813-a3b565d87c83 – dudeNumber4 2010-08-23 15:20:15