[英]sub linq query is making this take a very long time, how can I make this faster?
我有一個我這樣構建的員工列表:
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 result =
(from e in employees
select new EmployeeDetails
{
EmployeeId = e.employeeId,
LastSaleDates =
(from lsd in latestSales.Where(x => x.EmployeeId == e.EmployeeId)
.Select(x => x.SaleDate)
select lsd).ToList()
};
以上工作,但完成需要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)
};
不幸的是,您無法使用Linq to Entities的ToList()
方法。 因此,要么手動將匿名對象映射到EmployeeDetails
要么將LastSalesDates
類型更改為IEnumerable<DateTime>
。
您對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
方法。
您的模型中是否存在員工與latestSales之間的關聯? 您是否檢查過SQL Profiler或其他分析工具以查看生成的SQL? 確保ToList()沒有為每個員工發出單獨的查詢。
如果您可以將結果結構作為IEnumerable<EmployeeId, IEnumerable<DateTime>>
,您可以考慮將其修改為:
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)
};
我在http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-Database-Performance-hints上提供了一些更一般的建議,以幫助跟蹤問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.