【发布时间】:2011-08-11 18:26:00
【问题描述】:
我有一个 ASP .NET Web 表单应用程序,它收集信息以最终计算出汽车保险报价的保费。
我有大约 10 个屏幕来填充我们的根 CarRisk 对象,它具有 CarRisk.Proposer、CarRisk.AdditionalDrivers 和 CarRisk.CarRisk.CarRiskehicle 等属性。
无论如何,当我进入报价摘要屏幕(总结在前几页中输入的数据)时,我遇到了问题。由于每个驱动程序都可以有索赔/定罪/医疗条件,并且每个都与 claimType/convictionType 等有另一种关系,因此查询非常大。
我正在设法使用 CompiledQuery 将所有报价屏幕急切加载到摘要中,但是当我到达摘要时,尝试急切加载 CarRisk 时 EF 失败,因为它有 53 个包含。如果我尝试使用编译查询,查询甚至不会编译更不用说运行,它似乎只是导致 IIS 挂起!我有一种感觉,当我上次使用较少的包含(可能是 25 个)执行此操作时,我收到一个关于查询中使用的表过多的 SQL 服务器错误。我尝试将编译查询的结果合并到一个 carRisk 中,但在尝试设置类似 CarRisk.CarRiskVehicle = carRiskCarRiskVehicleCompiledQuery.CarRiskVehicle 的内容时出现错误,但出现错误“EntityCollection 已被初始化。InitializeRelatedCollection 方法应该只在对象图的反序列化期间调用以初始化新的 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")
【问题讨论】:
-
您是否需要在摘要屏幕上显示所有所包含实体的所有属性?如果不是,您不能使用仅收集您需要查看的属性以提高性能的投影吗?
-
我们不需要所有属性的所有属性。它们中的大多数实际上是定义的列表,我们只需要名称值,因此理论上我们可以这样做。但问题是上面的查询甚至不会加载!
标签: asp.net entity-framework linq-to-entities compiled-query