C# 优化EF查询以在1次调用中生成图形的所有点

C# 优化EF查询以在1次调用中生成图形的所有点,c#,sql,performance,entity-framework,linq-to-entities,C#,Sql,Performance,Entity Framework,Linq To Entities,我有一些C从数据库中提取数据来填充一个折线图。x轴是日期,y轴上每个日期有几个不同的值 y轴的值是x轴上给定日期的符合、警告或错误的属性实体计数。在ComplianceManager.PropertyIsCompliant/Warning/ErrorDateTime表达式中确定属性是否兼容、警告或错误 目前,EF代码必须为每个值、每个日期调用DB。我试着写它来延迟加载,直到y轴上每个点的最终计数。但是,它仍然必须为每个对象运行一个查询 我尝试从主引用表属性中包含各种其他关系,但它根本不会改变执行

我有一些C从数据库中提取数据来填充一个折线图。x轴是日期,y轴上每个日期有几个不同的值

y轴的值是x轴上给定日期的符合、警告或错误的属性实体计数。在ComplianceManager.PropertyIsCompliant/Warning/ErrorDateTime表达式中确定属性是否兼容、警告或错误

目前,EF代码必须为每个值、每个日期调用DB。我试着写它来延迟加载,直到y轴上每个点的最终计数。但是,它仍然必须为每个对象运行一个查询

我尝试从主引用表属性中包含各种其他关系,但它根本不会改变执行

        /* trimmed... DatesToLoad is a List<DateTime> of the points for the x axis */

        ComplianceOverviewPeriod result = new ComplianceOverviewPeriod();

        var allProperties = propertyRepo.GetProperties(); //IQueryable<Property>


        var points = (from d in DatesToLoad
                      select new
                      {
                          compliantCount = allProperties.Count(complianceManager.PropertyIsCompliant(d)),
                          warningCount = allProperties.Count(complianceManager.PropertyHasWarnings(d)),
                          errorCount = allProperties.Count(complianceManager.PropertyHasErrors(d)),
                          unknownCount = allProperties.Count(complianceManager.PropertyComplianceKnown(d)),
                          readingDate = d
                      });


        foreach (var point in points)
        {
            var complianceReading = new ComplianceOverview();

            complianceReading.CompliantProperties = point.compliantCount;
            complianceReading.ErrorProperties = point.errorCount;
            complianceReading.WarningProperties = point.warningCount;
            complianceReading.UntestedProperties = point.unknownCount;
            result.CompliancePoints.Add(complianceReading);
        }

是否有我遗漏的东西会使EF将所有日期和所有y值的加载延迟到最后,然后立即加载批次?

而不是选择新建{…}尝试使用选择新建ComplianceOverview{…}将结果直接放入ComplianceOverview对象中更改overview对象的创建并没有提高性能。它仍然使用相同数量的查询来创建图形。不过,您不再需要执行foreach循环。是的,如果我删除foreach并在select中创建对象,它仍然使用相同数量的查询