none
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")

                    ;

                   


    mardi 17 mai 2016 15:43

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

    mercredi 18 mai 2016 07:01
  • 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 ?

     

    mercredi 18 mai 2016 07:48
  • 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

    mercredi 18 mai 2016 08:08
  • 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
    mercredi 18 mai 2016 12:46
  • 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")
    ..

     

              


                


     

             

    lundi 30 mai 2016 13:33