我正在将项目从延迟加载迁移到渴望加载。
我需要得到一个带有所有子对象的大物体,对其进行序列化并发送到前端的SPA应用程序。
我建立了庞大的查询,但是它占用了太多的内存(如VS的数据诊断工具所示,内存使用量跳了200mb,序列化为JSON时对象本身约为60KB)
Include(x => x.Privileges)
.Include(x => x.Team.Branch)
.Include(x => x.Equality)
.Include(x => x.AddressDetails).Include(x => x.ContactDetails)
.Include(x => x.EmployeeDetails.GeneralUnavailability)
.Include(x => x.EmployeeDetails.EligibilityDocuments.Select(z => z.Document.Priviliges))
.Include(x => x.EmployeeDetails.Position.PositionPayRuleExceptions).Include(x => x.EmployeeDetails.Position.PositionPayRuleExceptions.Select(z => z.PayRule)).Include(x => x.EmployeeDetails.Position.DefaultOffer)
.Include(x => x.TransportationMode.ProofOfLicence.Priviliges).Include(x => x.TransportationMode.ProofOfInsurance)
.Include(x => x.UserAcademicQualifications.Select(z => z.AcademicQualification)).Include(x => x.UserAcademicQualifications.Select(z => z.AcademicQualificationScan.Priviliges))
.Include(x => x.ProfessionalRegistrations.Select(z => z.Body)).Include(x => x.ProfessionalRegistrations.Select(z => z.ProfessionalRegistrationScan.Priviliges))
.Include(x => x.Unavailabilities.Select(z => z.AbsenceType)).Include(x => x.Unavailabilities.Select(z => z.Document.Priviliges))
.Where(x=>x.Id=1)
我是第一次使用ef6进行查询...因为到目前为止我一直在使用延迟加载。有没有优化的方法?
Priviliges是Privilige模型的列表
Document,ProfessionalRegistrationScan,AcademicQualificationScan,ProofOfInsurance,ProofOfLicence正在使用具有许多关系特权的文件模型。
谢谢您的帮助
更新
尝试使用.AsNoTracking()作为测试..并且内存使用量跃升了约100mb。
对于〜60kb的对象来说仍然有点高...
最佳答案
好吧,数据就是某种数据。如果您确实需要所有这些,那么这可能是您可以做到的最好的选择。显然,急于加载和使用AsNoTracking
很有帮助。实际上,您只需要看几件事:
如果可以“分页”,则使用Skip
和Take
可以减少必须一次检索所有数据的数据量。很明显,在分页期间您将发出更多查询,但是每个查询都会更轻松,至少与用户始终相比,仅根据用户的请求才发生。例如,如果他们只关心结果的第一页,那么您就不必提取所有其余数据。
明智地使用Select
。如果只需要某些列,则仅将这些列选择为其他DTO类或异常对象将减轻查询的需求。
创建一个存储过程。如果您要查看由EF生成的类似查询,那可能会很庞大。 EF在优化查询方面做得相对不错,但是有了这么多的联接,它就无济于事了。然后,SQL Server必须解析所有这些SQL并提出执行计划,然后它才能实际运行查询并返回结果。存储过程将所有这些初始工作排除在等式之外。
如果您无法真正对其进行进一步优化,并且一次需要所有这些数据,那么您唯一的选择就是将资源投入数据库。确保它具有大量的RAM,大量的内核,一个快速的驱动器-最好是SSD,等等。还请确保Web服务器和数据库服务器之间的网络尽可能快。理想情况下,它们应该在同一局域网中。如果您必须穿越防火墙等,那将会大大减慢速度。
关于c# - Entity Framework 6急于加载具有许多子级和子级子级的大型对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45079165/