Auteur de questions
Entity framework c#

Question
-
J’ai repris un programme fait sous c# et frameword entity V4 Les requêtes sont tres très lentes
ci joint la source localisé de la lenteur, la cause semble les includes, auriez vous une idée pour remédier au pbm
merci d'avance
public static List<InterventionRealisee> GetInterventionByFiltre(RechercheDossierFiltre p_filtre, Boolean p_affichageDetaille)
{
p_filtre.DateDebut = p_filtre.DateDebut.Date;
p_filtre.DateFin = p_filtre.DateFin.Date.AddDays(1);
DataAccessSmartBlocContainer v_context = new DataAccessSmartBlocContainer(SingletonContext.GetInstance().Context.Connection.ConnectionString);
ObjectQuery<InterventionRealisee> v_query = v_context.InterventionRealiseeJeu
.Include("FKSalle")
.Include("FKChecklist")
.Include("FKChirurgie")
.Include("FKChirurgie.LSTOperateur")
.Include("FKChirurgie.LSTOperateur.FKActeRealise")
.Include("FKChirurgie.LSTOperateur.FKPersonnel")
;
- Modifié bazedine mardi 17 mai 2016 15:46
- Déplacé Emile Supiot mercredi 18 mai 2016 12:02
Toutes les réponses
-
Bonjour,
Voila ce que c'est que d'utiliser Entity Framework ;-)
Non, je plaisante mais il faut faire attention effectivement aux requêtes qui sont générées par EF.
Je conseille fortement (obligatoire là ou je travaille) d'utiliser SQL Profiler pour voir effectivement les requêtes créées par EF.
Dans votre cas, il y a pas mal de INNER JOIN qui doivent être ajoutée à cause des Include.
Un pour chaque Include et pas forcement des index correspondant dans la structure de la base.
De plus, vous pouvez avoir beaucoup de données : sont-elles vraiment utilisées ?
Donc pour analyser votre requête :
1/ SQL Profiler pour voir la requête générée.
2/ Avec SQL Manager, analysez cette requête et voyez les données retournées.
3/ Optimisez le tout.
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone -
Bonjour Richard et merci
Pour le 1 SQL Profiler et le 2 SQL manager c'est fait
et en effet je remarque qu'il y'a des tables ouvertes via include pour seulement récupérer une colonne (dans le cas il s'agit des numéros de salle situé dans L'entity table FKSalle)
justement c'est dans la 3eme étape que je bloque, comment optimiser ceci ?
-
A priori oui en faisant une projection.
http://stackoverflow.com/questions/1531934/entity-framework-only-get-specific-columns
NB: je ne sais pas qui était votre architecte, mais il m'a l'air de vous avoir pondu une belle usine à gaz ;-) (SingletonContext!!!)
NBBis : n'oubliez jamais de faire un ToList à la fin de votre interrogation de la base de données. Vous êtes sur ainsi de maitriser la requête générée par EF.
Richard Clark
Consultant - Formateur .NET
http://www.c2i.fr
Depuis 1996: le 1er site .NET francophone -
Merci richard
:-) oui C'est vraiment le cas c'est une vraie usine a gaz
dans mon cas comment puis je integrer la projection ?
sachant que j'ai besoin du libelle de la table Salle(entity Sallejeu)
il y'a une association KFsalle dans interventionRealisee dans le quelle se trouve seulement le code_salle (Index)
- Modifié bazedine mercredi 18 mai 2016 13:25
-
Bonjour Richardj'ai essayer avec une projection je coince
car les entité dans le context est diffèrent
Petite idée ? Merci encore
string esqlQuery = @"SELECT c.Libelle"+
"FROM KFSalle";
ObjectQuery<InterventionRealisee> v_query = new ObjectQuery<InterventionRealisee>(esqlQuery, v_context)
.Include("FKSalle")
.Include("FKChecklist")
..