c# - 实体框架:如何优化以下 linq 查询?
问题描述
我需要一些关于如何改进以下查询的建议。
from o in this.DbContext.Set<School>().AsNoTracking()
from s in o.Teachers.DefaultIfEmpty()
where SchoolCodes.Contains(o.Code)
select new TabularItem
{
SchoolId = o.Id,
SchoolCode = o.Code,
SchoolPurchaseOrderReference = o.PurchaseOrderReference,
SchoolDescription = o.OrderDescription,
SchoolActivityStatus = o.ActivityStatusesInternal.FirstOrDefault(os => os.ActivityName == orderLoggingActivity),
Type = o.TypesAsString,
CustomerCode = o.CustomerCode,
TeacherId = s == null ? (Guid?)null : s.Id,
TeacherCode = s == null ? null : s.Code,
TeacherCustomerReference = s == null ? null : s.CustomerReference,
TeacherIsImported = s == null ? (bool?)null : s.IsImported,
TeacherIsRegisteredUnderModification = s == null ? (bool?)null : s.IsRegisteredUnderModification,
TeacherStatus = s == null ? null : s.StatusAsString,
TeacherStatusChangeDate = s == null ? (DateTimeOffset?)null : s.StatusChangeDate,
IsReportInProgress = s == null ? false : s.IsReportInProgress,
TeacherActivityStatus = s == null ? null : s.ActivityStatusesInternal.FirstOrDefault(ss => ss.ActivityName == orderLoggingActivity),
TeacherHasUnresolvedIssue = s.TeacherIssuesInternal.Any(si => unresolvedIssueStatuses.Contains(si.StatusAsString)),
TeacherHasAdvancePaymentInProgressInvoiceableItem = s.FractionsInternal.SelectMany(x => x.TestPRepetitionsInternal).Any(x => x.InvoiceableItem.IsAdvancePaymentInProgress),
TeacherHasInvoicingInProgressInvoiceableItem = s.FractionsInternal.SelectMany(x => x.TestPRepetitionsInternal).Any(x => x.InvoiceableItem.IsInvoicingInProgress && x.InvoiceableItem.InvoicingStatusAsString != doNotInvoiceStatus),
HasSchoolBasedInvoiceableItems = s.School.InvoiceableItemsInternal.Any(item => item.InvoicingStatusAsString != orderBasedInvoiceableItemStatus),
SchoolHasInvoicingInProgressInvoiceableItem = s.School.InvoiceableItemsInternal.Any(x => x.IsInvoicingInProgress && x.InvoicingStatusAsString != doNotInvoiceStatus)
};
这里 School--> Teacher --> Fraction --> TestPRepetition --> InvoiceableItem 表之间的关系。
请建议我在哪里可以提高性能。这只会命中一次,所以我不能使用编译查询。没有用。
解决方案
简单的。不要加载所有数据。
Teacher -> Fraction -> TestRPepetition 乘以您提取的 odf 数据量。
Ef 旨在提取您需要的数据,现在将大量相关数据加载到内存中,以防您有一天需要它。
拉取你此时需要的最少数据量,当你需要更多时返回数据库。当您通过添加预加载遇到问题时从那里进行优化,但始终保持在您需要的最低限度。
现在,您在特定代码中加载与所有 tacher 相关的所有数据。这可能是一个荒谬的数据量,主要是噪声,没有在进一步处理中正确使用。
推荐阅读
- python - 在 Python3 中使用优先队列进行堆栈
- python - 具有多个根元素的“XML”文档
- python - 将 .txt 文件中的元素作为列表而不是字符串打开
- python - 如何使用 Django 中的选择 - 如何显示特定内容?
- android - 该位置没有 XML:http://schemas.android.com/apk/res/android
- ruby-on-rails - 如何从静态站点向 Rails 应用程序发布请求?
- javascript - firebase.fireStore() 不是函数
- c# - 使用音频剪辑获取 1 秒的样本?
- mysql - 如何从 MySQL 中删除自定义帖子类型?
- bash - sh 脚本捕获文本并添加到空格分隔的变量