Entity Framework Большой запрос - разбить на скомпилированные подзапросы? - PullRequest
1 голос
/ 11 августа 2011

У меня есть приложение для веб-форм ASP .NET, которое собирает информацию, чтобы в конечном итоге дать рассчитанную премию за квоту по страхованию автомобиля.

У меня есть около 10 экранов, на которых мы заполняем наш корневой объект CarRisk, у него есть такие свойства, как CarRisk.Proposer, CarRisk.AdditionalDrivers & CarRisk.CarRiskVehicle.

Во всяком случае, у меня возникла проблема, когда я попадаю на экран сводки котировок (суммирует данные, введенные на предыдущих страницах). Поскольку у каждого водителя могут быть претензии / осуждения / медицинские условия, и у каждого из них есть другое отношение к ApplicType / convictionType и т. Д., Запрос очень велик.

Мне удается загружать все экраны с цитатами до сводки, используя CompiledQuery, но когда я получаю сводку, EF не удается при попытке загрузить CarRisk, поскольку он имеет 53 включений. Если я попытаюсь использовать скомпилированный запрос, запрос даже не скомпилируется, не говоря уже о запуске, просто кажется, что IIS зависает! У меня возникает ощущение, что когда я в последний раз делал это с меньшим количеством включений (возможно, 25), я получал ошибку сервера SQL из-за слишком большого количества таблиц, используемых в запросе. Я попытался объединить результаты скомпилированных запросов в один carRisk, но у меня возникает ошибка при попытке установить что-то вроде CarRisk.CarRiskVehicle = carRiskCarRiskVehicleCompiledQuery.CarRiskVehicle, но я получаю ошибку "EntityCollection уже инициализирован. Метод InitializeRelatedCollection должен только быть вызванным для инициализации новой коллекции EntityCollection во время десериализации графа объектов. ".

Итак, я вернулся к отложенной загрузке, но это происходит намного медленнее, и клиент недоволен снижением производительности. Я пытался отключить ChangeTracking во время LazyLoading, но не могу сказать, что это значительное улучшение.

Любые предложения / идеи о том, что я должен делать?

Я покажу вам включенные ниже, чтобы вы могли видеть

ent.CarRisks

                                        .Include("BusinessSource")          // Risk Includes
                                        .Include("PreviousInsuranceDetail")
                                        .Include("Quote.QuoteStatus")
                                        .Include("ClassOfUse")  // CarRisk Includes
                                        .Include("CoverType")
                                        .Include("ReferralSource")
                                        .Include("MainDriver")
                                        .Include("VoluntaryExcess")
                                        .Include("UserSpecifiedNumberOfDrivers")
                                        .Include("Proposer.Address")           // Proposer Includes
                                        .Include("Proposer.NumberOfOtherVehiclesAvailable")
                                        .Include("Proposer.OwnersClub")
                                        .Include("Proposer.BusinessCategory")         // CarDriver Includes
                                        .Include("Proposer.BusinessCategory2")
                                        .Include("Proposer.EmploymentStatus")
                                        .Include("Proposer.EmploymentStatus2")
                                        .Include("Proposer.Gender")
                                        .Include("Proposer.LicenceType")
                                        .Include("Proposer.MaritalStatus")
                                        .Include("Proposer.Occupation")
                                        .Include("Proposer.Occupation2")
                                        .Include("Proposer.Title")                                           
                                        .Include("Proposer.Claims.ClaimStatus")
                                        .Include("Proposer.Claims.ClaimType")
                                        .Include("Proposer.Convictions.ConvictionCode")
                                        .Include("Proposer.Convictions.ConvictionTestMethod")
                                        .Include("AdditionalDrivers.RelationshipToPolicyHolder")
                                        .Include("AdditionalDrivers.BusinessCategory")       // CarDriver Includes
                                        .Include("AdditionalDrivers.BusinessCategory2")
                                        .Include("AdditionalDrivers.EmploymentStatus")
                                        .Include("AdditionalDrivers.EmploymentStatus2")
                                        .Include("AdditionalDrivers.Gender")
                                        .Include("AdditionalDrivers.LicenceType")
                                        .Include("AdditionalDrivers.MaritalStatus")
                                        .Include("AdditionalDrivers.Occupation")
                                        .Include("AdditionalDrivers.Occupation2")
                                        .Include("AdditionalDrivers.Title")
                                        .Include("AdditionalDrivers.Claims.ClaimStatus")
                                        .Include("AdditionalDrivers.Claims.ClaimType")
                                        .Include("AdditionalDrivers.Convictions.ConvictionCode")
                                        .Include("AdditionalDrivers.Convictions.ConvictionTestMethod")
                                        .Include("CarRiskVehicle.Car")
                                        .Include("CarRiskVehicle.OvernightParkLocation")
                                        .Include("CarRiskVehicle.RegisteredKeeper")
                                        .Include("CarRiskVehicle.RegisteredOwner")
                                        .Include("CarRiskVehicle.Transmission")
                                        .Include("CarRiskVehicle.Modifications")
                                        .Include("CarRiskVehicle.CarRiskVehicleSecurityDevices")
                                        .Include("CarRiskVehicle.MotorHomeType")
                                        .Include("CarRiskVehicle.AlarmType")
                                        .Include("CarRiskVehicle.TrackerType")
                                        .Include("CarRiskVehicle.Address")

1 Ответ

3 голосов
/ 12 августа 2011

Это безумно !!! Обязательно вернитесь к архитектуре приложения и подумайте еще раз. Поверьте мне: вам не нужны все эти включения в одном запросе. Разделите запрос или используйте прогнозы.

Ошибка, которую вы получаете, возникает, если ваша сущность проксируется для отложенной загрузки (POCO) или, возможно, она получена из EntityObject. Попробуйте отключить отложенную загрузку (objectContext.ContextOptions) перед загрузкой этих объектов.

...