【问题标题】:Entity Framework Large Query - split into compiled subqueries?实体框架大型查询 - 拆分为已编译的子查询?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 多么粗鲁,为什么要发疯!?!其中很多是 EF 4.0 不支持的已定义列表值或枚举。您将如何显示需要所有这些信息的摘要页面。索赔/定罪/医疗条件都是重复使用的对象,但必须包含在查询中才能显示在摘要屏幕上。
  • 另外,我们不使用 POCO 仅供参考。
  • 这并不粗鲁。只需打开 SQL Profiler,您就会立即看到它有多么错误。如果您无法执行 SQL,请将结果查询转换为 ObjectQuery 并调用 ToTraceString 以查看 SQL。 EntityObjects 应该具有自动导航属性修复。通过单独的查询加载实体,如果你幸运的话,主实体上的导航属性将被简单地填充,而无需手动分配它们。
  • 每个Include 代表几个连接,有时也代表子查询。这样的理解应该告诉你这个查询很疯狂。甚至报告应用程序也不使用此类查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多