C# 实体框架:如何优化此linq查询?

C# 实体框架:如何优化此linq查询?,c#,.net,performance,linq,entity-framework-6,C#,.net,Performance,Linq,Entity Framework 6,我需要一些关于如何改进以下查询的建议 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, SchoolPurchaseOrderRefe

我需要一些关于如何改进以下查询的建议

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)
};
this.DbContext.Set().AsNoTracking()中的o中的

来自o.Teachers.DefaultIfEmpty()中的s
其中SchoolCodes.Contains(o.Code)
选择新表格格式
{
学校Id=o.Id,
学校代码=o.代码,
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.代码,
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),
TeacherHasUnsolveDisease=s.TeacherIssuesInternal.Any(si=>UnsolveDissuseStatuses.Contains(si.StatusAsString)),
教师在程序中有预付款OICEABLE项=s.FractionsInternal。选择多个(x=>x.testprepetionsinternal)。任何(x=>x.InvoiceableItem.IsAdvancePaymentInProgress),
TeacherHasInvoicingInProgressInvoiceableItem=s.FractionsInternal。选择多个(x=>x.TestPRepetitionsInternal)。任意(x=>x.InvoicingItem.IsInvoicingInProgress&&x.InvoicingItem.InvoicingStatusAsString!=doNotInvoiceStatus),
HasSchoolBasedInvoiceableItems=s.School.InvoiceableItemsInternal.Any(item=>item.InvoicingStatusAsString!=orderBasedInvoiceableItemStatus),
SchoolHasInvoicingInProgressingInvoiceableItems=s.School.InvoiceableItems内部.Any(x=>x.IsInvoicingInProgress&&x.InvoicingStatusAsString!=doNotInvoiceStatus)
};
这里是学校-->教师-->分数-->测试准备-->表之间的InvoiceableItem关系


请告诉我在哪里可以提高绩效。这只会命中一次,所以我不能使用编译后的查询。没有用。

简单。不要加载所有数据

教师->分数->测试配置乘以您提取的odf数据量

Ef是用来提取您需要的数据的,现在将大量相关数据加载到内存中,以备将来需要

此时提取所需的最小数据量,需要更多数据时返回数据库。当您遇到问题时,通过添加预加载进行优化,但始终保持所需的最小值


现在加载与特定代码中的所有链接相关的所有数据。这可能是一个荒谬的数据量,大部分是噪声,在进一步处理中没有正确使用。

有几个选项,但在EF中很少有

  • 清除数据库中的空值
  • 将TeacherHasInvoicingInProgressInvoiceableItem之类的隐含实体关系构建到数据库中(通过外键或映射表)
  • 预取重复语句,如o.ActivityStatusesInternal.FirstOrDefault

既然我只选择并加载了所需的列,那么教师的所有数据是如何加载的?你能举个例子说明如何只加载教师中的特定列吗?是的,不要加载它们。简单。你把它们放进新的容器里——扔掉你不需要的东西。