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的呼叫,让他们回忆起来,谢谢!