簡體   English   中英

sub linq查詢使得這需要很長時間,我怎樣才能讓它更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM