Проблема производительности Linq to Entities со многими столбцами - PullRequest
2 голосов
/ 31 августа 2011

У меня проблема с получением linq, чтобы объекты работали хорошо. У моего запроса (не моего, поддерживающего чей-то код :-)) есть несколько включений, которые, как я определил, необходимы для экрана WPF, который использует результаты этого запроса.

Теперь сгенерированный SQL выполняется очень быстро и возвращает только одну строку данных. Но он возвращает 570 столбцов, и я думаю, что снижение производительности связано с созданием всех объектов и всех этих полей.

Я пытался использовать отложенную загрузку, но это, похоже, не влияет на производительность.

Я попытался удалить все ненужные операторы «include», но, похоже, все они необходимы.

вот запрос linq:

var myQuery = 
                from appt in ctx.Appointments
                               .Include("ScheduleColumnProfile")
                               .Include("EncounterReason")
                               .Include("Visit")
                               .Include("Visit.Patient")
                               .Include("Visit.Patient.PatientInsurances")
                               .Include("Visit.Patient.PatientInsurances.InsuranceType")
                               .Include("Visit.Patient.PatientInsurances.InsuranceCarrier")
                               .Include("MasterLookup")
                               .Include("User1")
                               .Include("User2")
                               .Include("Site")
                               .Include("Visit.Patient_CoPay")
                               .Include("Visit.Patient_CoPay.User")
                               .Include("Visit.VisitInstructions.InstructionSheet")
                    where appt.VisitId == visitId 
                        && appt.MasterLookup.LookupDescription.ToUpper() != Rescheduled 
                        && appt.Site.PracticeID == practiceId
                        && appt.MasterLookup.LookupDescription.ToUpper() != Cancelled
                    orderby appt.AppointmentId descending
                    select appt;

Сгенерированный SQL имеет длину 4000 строк с 570 столбцами в выбранной статистике и 3 или 4 Union ALLs, поэтому я не собираюсь вставлять его сюда, если кто-то ДЕЙСТВИТЕЛЬНО не хочет его видеть. По сути, я ищу способ избавиться от профсоюзов, если это возможно, и обрезать столбцы только до того, что нужно.

Помощь!

: -)

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

, если кто-то отслеживает, это решение, которое в итоге сработало для меня. Спасибо всем, кто прокомментировал и сделал предложения ... это в конечном итоге привело меня к тому, что у меня есть ниже.

            ctx.ContextOptions.LazyLoadingEnabled = true;

            var myQuery =
                from appt in ctx.Appointments
                where appt.VisitId == visitId
                    && appt.MasterLookup.LookupDescription.ToUpper() != Rescheduled
                    && appt.Site.PracticeID == practiceId
                    && appt.MasterLookup.LookupDescription.ToUpper() != Cancelled
                orderby appt.AppointmentId descending
                select appt;


            var myAppt = myQuery.FirstOrDefault();

            ctx.LoadProperty(myAppt, a => a.EncounterReason);
            ctx.LoadProperty(myAppt, a => a.ScheduleColumnProfile);
            ctx.LoadProperty(myAppt, a => a.Visit);
            ctx.LoadProperty(myAppt, a => a.MasterLookup);
            ctx.LoadProperty(myAppt, a => a.User1);
            ctx.LoadProperty(myAppt, a => a.User2);
            ctx.LoadProperty(myAppt, a => a.PatientReferredProvider);

            var myVisit = myAppt.Visit;

            ctx.LoadProperty(myVisit, v => v.Patient);
            ctx.LoadProperty(myVisit, v => v.Patient_CoPay);
            ctx.LoadProperty(myVisit, v => v.VisitInstructions);
            ctx.LoadProperty(myVisit, v => v.EligibilityChecks);

            var pat = myVisit.Patient;

            ctx.LoadProperty(pat, p => p.PatientInsurances);


            //load child insurances
            foreach (PatientInsurance patIns in myAppt.Visit.Patient.PatientInsurances)
            {
                ctx.LoadProperty(patIns, p => p.InsuranceType);
                ctx.LoadProperty(patIns, p => p.InsuranceCarrier);
            }

            //load child instruction sheets
            foreach (VisitInstruction vi in myAppt.Visit.VisitInstructions)
            {
                ctx.LoadProperty(vi, i => i.InstructionSheet);
            }

            //load child copays
            foreach (Patient_CoPay coPay in myAppt.Visit.Patient_CoPay)
            {
                ctx.LoadProperty(coPay, c => c.User);
            }

            //load child eligibility checks
            foreach (EligibilityCheck ec in myAppt.Visit.EligibilityChecks)
            {
                ctx.LoadProperty(ec, e => ec.MasterLookup);
                ctx.LoadProperty(ec, e => ec.EligibilityResponse);
            }
0 голосов
/ 31 августа 2011

Я бы порекомендовал создать новый класс, содержащий только те свойства, которые вам нужны для отображения.Когда вы проецируете на новый тип, вам не нужно иметь операторы Include, но вы все равно можете получить доступ к свойствам навигации объекта.

var myQuery = from appt in ctx.Appointments
              where appt.VisitId == visitId 
                    && appt.MasterLookup.LookupDescription.ToUpper() != Rescheduled 
                    && appt.Site.PracticeID == practiceId
                    && appt.MasterLookup.LookupDescription.ToUpper() != Cancelled
              orderby appt.AppointmentId descending
              select new DisplayClass
              {
                 Property1 = appt.Prop1,
                 Proeprty2 = appt.Visit.Prop1,
                 .
                 .
                 .
              };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...