1

我有一个 ASP .NET Web 表单应用程序,它收集信息以最终计算出汽车保险报价的保费。

我有大约 10 个屏幕来填充我们的根 CarRisk 对象,它具有诸如 CarRisk.Proposer、CarRisk.AdditionalDrivers 和 CarRisk.CarRiskehicle 之类的属性。

无论如何,当我进入报价摘要屏幕(总结在前几页中输入的数据)时,我遇到了问题。由于每个驱动程序都可以有索赔/定罪/医疗条件,并且这些条件中的每一个都与 claimType/convictionType 等有另一种关系,因此查询非常大。

我正在设法使用 CompiledQuery 将所有报价屏幕急切加载到摘要中,但是当我到达摘要时,EF 在尝试急切加载 CarRisk 时失败,因为它有 53 个包含。如果我尝试使用编译查询,查询甚至不会编译更不用说运行,它似乎只是导致 IIS 挂起!我有一种感觉,当我上次使用较少的包含(可能是 25 个)执行此操作时,我收到一个关于查询中使用的表过多的 SQL 服务器错误。我尝试将编译查询的结果合并到一个 carRisk 中,但在尝试设置类似 CarRisk.CarRiskVehicle = carRiskCarRiskVehicleCompiledQuery.CarRiskVehicle 的内容时出现错误,但出现错误“EntityCollection 已被初始化。

所以我已经恢复到延迟加载,但是速度慢了很多,而且客户对性能下降感到不满。我试过在 LazyLoading 时关闭 ChangeTracking,但不能说这是一个巨大的改进。

关于我应该做什么的任何建议/想法?

我将向您展示以下包含的内容,以便您查看

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

1 回答 1

3

太疯狂了!一定要回到应用程序架构并重新思考。相信我:您不需要在单个查询中包含所有这些内容。划分查询或使用预测。

如果您的实体被代理用于延迟加载 (POCO) 或者它可能源自EntityObject. objectContext.ContextOptions在加载这些实体之前尝试关闭延迟加载 ( )。

于 2011-08-11T20:08:54.647 回答