Bonjour
J’ai repris un programme (c# et Entity Framework) avec des tres gros lenteur de requetes apres avoir examniner avec sql profiler, conclusion il y’ a trop de include dans le programme, qui se charge en mémoire
ont m’a dit de faire une projection exemple du type var q = from r in v_…….
select … { Lebelle = r.Libelle, },
la question est comment l'appliquer J’ai pas su faire pouvez vous m’aider
Voici le code :
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);
//TODO ne pas garder
//String v_connexionString = String.Format(ConfigurationSettings.AppSettings["FormattedConnectionString"], "stuardi");
////DataAccessSmartBlocContainer v_context = new DataAccessSmartBlocContainer(v_connexionString);
// FIN TODO
//Les Include demandent de la ressource pour populer les objets InterventionRealisee
//On les utilise donc que si nécessaire
//Include systématiquement utilisés pour l'affichage
ObjectQuery<InterventionRealisee> v_query = v_context.InterventionRealiseeJeu;
.Include("FKSalle")
.Include("FKChecklist")
.Include("FKChirurgie")
.Include("FKChirurgie.LSTOperateur")
.Include("FKChirurgie.LSTOperateur.FKActeRealise")
.Include("FKChirurgie.LSTOperateur.FKPersonnel")
;
var q = from r in v_context.SalleJeu
select Libelle
{
Id = r.Id,
Status = r.Status
}
if (p_affichageDetaille)
{
v_query = v_query.Include("FKDiscipline");
v_query = vquery.Include("FKRegulation");
v_query = v_query.Include("FKRegulation.FKChirurgien");
v_query = v_query.Include("FKRegulation.FKTypeInterventionProgrammee");
v_query = v_query.Include("FKRegulation.FKAnesthesiste");
v_query = v_query.Include("FKEnqueteInciso");
v_query = v_query.Include("FKAnesthesie.FKAnesthesiste1");
v_query = v_query.Include("FKAnesthesie.FKAnesthesiste2");
}
else
{
if (p_filtre.Anesthesiste.HasValue)
{
v_query = v_query.Include("FKAnesthesie");
}
if (!string.IsNullOrEmpty(p_filtre.Chirurgien))
{
v_query = v_query.Include("FKRegulation").Include("FKRegulation.FKChirurgien");
}
}
IEnumerable<InterventionRealisee> v_resultat = v_query.Where(PredicatFiltre(p_filtre));
//On ne peut pas appliquer tous les critères avec PredicatFiltre
//On fait le reste ici
//CRITERE SUR LES PLATEAUX
if (p_filtre.Plateaux.Count > 0)
{
v_resultat = v_resultat.Where(ir => p_filtre.Plateaux.Contains(ir.FKBlocReference.EntityKey.EntityKeyValues[0].Value.ToString()));
}
//CRITERE SUR LE TYPE D'INTERVENTION
if (!string.IsNullOrEmpty(p_filtre.TypeIntervention))
{
v_resultat = v_resultat.Where(ir => ir.FKChirurgie == null ? false : ir.FKChirurgie.LSTOperateur.Where(o => !o.IsDeleted).Select(o => (int)o.FKActeRealiseReference.EntityKey.EntityKeyValues[0].Value).Contains(int.Parse(p_filtre.TypeIntervention)));
}
//CRITERE SUR LE CHIRURGIEN
if (!string.IsNullOrEmpty(p_filtre.Chirurgien))
{
// v_resultat = v_resultat;
v_resultat = v_resultat.Where(ir =>
(ir.FKChirurgie != null && ir.FKChirurgie.LSTOperateur.Count(o => !o.IsDeleted) > 0 && ir.FKChirurgie.LSTOperateur.Where(o => !o.IsDeleted).Select(o => o.FKPersonnel.Id).Contains(int.Parse(p_filtre.Chirurgien)))
||
(ir.FKRegulation != null && ir.FKRegulation.FKChirurgien != null && ir.FKRegulation.FKChirurgien.Id == int.Parse(p_filtre.Chirurgien))
);
}
//SingletonContext.GetInstance().Context.Refresh(System.Data.Objects.RefreshMode.StoreWins, v_resultat);
List<InterventionRealisee> v_resultatListe = v_resultat.ToList();
v_context.Dispose();
return v_resultatListe
Partager