J'ai une relation de parent-enfant. Dans un dépôt, je fais ceci:EF prend pour toujours générer cette requête
return (from p in _ctx.Parents
.Include("Children")
select p).AsQueryable<Parent>();
Puis dans un filtre, je veux faire un filtrage du parent par une liste des enfants ids:
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;
Ma liste de ids est énorme. Cela génère une instruction SQL simple qui possède une énorme liste d'identifiants "in (1,2,3 ...)", mais cela ne prend pas beaucoup de temps pour s'exécuter tout seul. EF, cependant, prend environ une minute complète juste pour générer la déclaration. Je l'ai prouvé en fixant un point d'arrêt et d'appeler:
((ObjectQuery<Parent>)filtered).ToTraceString();
Cela prend tout le temps. Est-ce que le problème est dans ma dernière déclaration linq? Je ne connais pas d'autre moyen de faire l'équivalent de Child.ChildId dans (ids). Et même si ma déclaration de linq est mauvaise, comment dans le monde cela devrait-il prendre tant de temps?
Publiez votre schéma et le sql généré, vous pouvez obtenir plus d'aide. –
Le schéma ne semble pas avoir d'importance, pas plus que la relation parent/enfant. Même problème en sélectionnant simplement à partir d'une seule table/entité avec une grande liste. – dudeNumber4
Pour toute autre personne rencontrant le problème; de tout ce que je peux dire, il n'y a pas de solution avec EF4. Vous devez recourir à des procédures stockées. Plus d'informations: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d629c798-db45-4a04-9813-a3b565d87c83 – dudeNumber4