【发布时间】:2017-12-18 03:35:49
【问题描述】:
我正在将一个项目从延迟加载迁移到急切加载。
我需要获取一个包含所有子对象的大对象,将其序列化并发送到前端的 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 进行查询...因为直到现在我都在使用延迟加载。有没有办法优化它?
Privilige 是 Privilige 模型的列表
Document、ProfessionalRegistrationScan、AcademicQualificationScan、ProofOfInsurance、ProofOfLicence 正在使用具有多对多关系权限的文件模型。
感谢您的帮助
更新
尝试使用 .AsNoTracking() 作为测试..内存使用量随之增加约 100mb。 对于 ~60kb 的对象来说,这仍然有点高......
【问题讨论】:
-
你使用 .AsNoTracking() 吗?另外,“内存过多”是指对象实际上太大而无法放入内存,或者查询执行速度太慢?如果是这种情况,请记住包含许多包含的查询尤其需要一些时间才能转换为 SQL。
-
查询执行时间为 200 毫秒,比延迟加载快 10 倍。该对象的大小(以 MB 为单位)并没有那么大。它只是执行该查询需要 200 MB 的内存..如 VS 的数据诊断工具所示。 .AsNoTracking() 会使对象分离吗?我也有需要保存更改的地方......
-
嗯,我想我以前没见过
AsNoTracking增加 内存使用...如果你尝试修改数据肯定会导致一些问题并在以后保存它,尽管可以解决它们。 -
是否可以将所有这些包含转换为某种内连接查询来构建大对象?我认为,主内存使用来自 EF 尝试自动生成查询。
标签: c# entity-framework asp.net-mvc-5 eager-loading