Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子linq查询使这需要很长时间,如何使其更快?_C#_Linq_Entity Framework - Fatal编程技术网

C# 子linq查询使这需要很长时间,如何使其更快?

C# 子linq查询使这需要很长时间,如何使其更快?,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一份员工名单,我是这样建立的: var employees = db.employees.Where(e => e.isActive == true).ToList(); var latestSales = from es in db.employee_sales.Where(x => x.returned == false); int employeeId List<DateTime> lastSaleDates 现在我想要的是这样的结果: var emplo

我有一份员工名单,我是这样建立的:

var employees = db.employees.Where(e => e.isActive == true).ToList();

var latestSales = from es in db.employee_sales.Where(x => x.returned == false);
int employeeId
List<DateTime> lastSaleDates
现在我想要的是这样的结果:

var employees = db.employees.Where(e => e.isActive == true).ToList();

var latestSales = from es in db.employee_sales.Where(x => x.returned == false);
int employeeId
List<DateTime> lastSaleDates
上面的工作,但实际上需要1分钟完成


有什么更有效的方法可以做到这一点?

您可以使用join在一次查询中获取所有数据

var result = from e in db.employees.Where(x => x.isActive)
             join es in db.employee_sales.Where(x => x.returned)
                  on e.EmployeeId equals es.EmployeeId into g
             select new {
                  EmployeeId = e.employeeId,
                  LastSaleDates = g.Select(x => x.SaleDate)
             };

不幸的是,不能将
ToList()
方法与Linq to实体一起使用。因此,要么手动将匿名对象映射到您的
EmployeeDetails
,要么将
LastSalesDates
类型更改为
IEnumerable
,您对
ToList
的调用会将内容拖进内存。您应该选择构建Linq表达式,而不是将整个查询拉入内存。在第二个查询中,您将为每个员工发出一个新的查询,因为您的查询将在Linq to objects域中操作(而不是在EF中)。尝试删除对
ToList
的呼叫

您还应该研究如何使用外键关联属性,以使此查询更好。关联属性是EF中最强大、最有用的部分。了解更多关于他们的信息。如果您具有适当的关联属性,那么您的查询可以如下所示:

var result = from e in employees
      select new EmployeeDetails
    {
        EmployeeId = e.employeeId,
        LastSaleDates = e.AssociatedSales
    }

您也可以考虑使用连接来代替。阅读Linq的

Join
方法。

在您的模型中,员工和最新销售人员之间是否存在关联?您是否检查过SQL分析器或其他分析工具以查看生成的SQL?确保ToList()没有为每个员工发出单独的查询

如果您可以将结果结构作为<代码> iQueabd,您可以考虑将其修改为:

var result = (from e in employees
        select new EmployeeDetails
        {
                EmployeeId = e.employeeId,
                LastSaleDates = (from lsd in latestSales
                                 where e.employeeId equals lsd.EmployeeId
                                 select lsd.SaleDate)
        };

我在上有一些更一般的建议,以帮助跟踪问题。

您是否多次运行该查询?我相信第一个查询需要更长的时间,因为caching@Jonesy当您对查询结果中的每个项执行DB查询时,它的速度往往很慢;是否缓存。nice一般建议+1。顺便说一句,还有一个很好的工具,你在@lazyberezovsky的文章中没有提到,实际上我也包括了它。EfProf.com重定向到了那个,但再次提及它并没有什么坏处。FWIW,MiniProfiler是Stack的伙计们为优化这个网站而写的,所以请随意给他们一些爱。这是对ToList的呼叫,让他们回忆起来,谢谢!