Je dispose d'un processus de longue durée qui s'intègre à une collection d'entités entrantes pour déterminer si l'entité entrante est différente de l'entité dans le stockage persistant. Quand j'ai écrit ceci pour la première fois, j'ai récupéré chaque entité de la base de données qui correspondait à l'entité que je comparais, j'ai aussi eu quelques inclusions pour extraire des entités référencées que j'avais aussi besoin de comparer. C'était incroyablement lent car chaque comparaison impliquait une requête de base de données et ensuite Entity Framework 'réparer'. J'utilise maintenant une requête pour extraire toutes les entités dont j'ai besoin pour mes comparaisons avant de commencer le processus. Cela me permet de prendre la vitesse à l'avant afin que je puisse accélérer considérablement mon processus. Cependant, la requête initiale nécessite encore au moins une minute ou deux pour s'exécuter.Quel est le meilleur moyen de conserver un graphe d'objet Entity Framework en mémoire?
Dictionary<long, SomeEntity> someEntities = new SomeEntitiesInclude().ApplyTo(context.SomeEntities)
.Where(se => se.SomeRelatedEntity.ID == relatedEntityID)
.Where(se => se.SCDCurrent == true)
.OrderBy<SomeEntity, long>(se => se.SomeRelatedEntity.ID)
.ToDictionary<SomeEntity, long>(se => se.SomeRelatedEntity.ID);
La requête sql réelle produite à partir de cela ne prend que quelques secondes pour exécuter je pense que la plupart du temps est consacré à faire « réparer » si le contexte peut suivre les changements.
L'objet SomeEntitiesInclude me permet d'utiliser des déclarations comprennent fortement typé et est une sous-classe de la classe IncludeStratergy développée par Alex James: http://blogs.msdn.com/alexj/archive/2009/07/25/tip-28-how-to-implement-include-strategies.aspx
Est-ce que quelqu'un a des conseils pour accélérer l'exécution de ce?
Toutes mes excuses pour la longue question.
James
Merci Craig, réponse très utile, cela me donne au moins un point de départ pour enquêter. – James