2013-12-17 47 views
0

的,這是我的表達:Optimalisation拉姆達查詢

var d = DateTime.Now.AddDays(-60); 
return db.Orders 
.Where(o => o.CreateDate > d && o.Status > 3) 
.Join(db.OrderItems, o => o.OrderId, o => o.OrderId, (o, p) => new { Order = o, OrderItem = p }) 
.Join(db.Customers, o => o.Order.CustomerId, o => o.CustomerId, (o, p) => new { o.Order, o.OrderItem, Customer = p }) 
.GroupBy(p => new {p.Customer.CustomerId, p.Customer.Name}) 
.Select(o => new CustomerMonthSale 
{ 
CustomerId = o.Key.CustomerId, 
Name = o.Key.Name, 
Price = o.Sum(p => p.OrderItem.Price * p.OrderItem.Quantity) 
}) 
.OrderByDescending(o => o.Price) 
.Take(10).ToList(); 

它需要6秒。它應該提供大約100條記錄,但在查詢結束時,我會得到前10名。當計數訂單和orderItems時,它正在訪問可能有幾千條記錄。我懷疑問題在於數據庫的大小,因爲我有類似的表達式訪問數據量較大的6倍,它需要400毫秒。我認爲它的選擇......但實際上我不知道。

+0

需要多長時間才能執行?您訪問了多少條記錄? –

+0

[Code Review](http://codereview.stackexchange.com/) – DGibbs

+0

需要6秒。它應該提供大約100條記錄,但在查詢結束時,我會得到前10名。當計數訂單和orderItems時,它正在訪問可能有幾千條記錄。我懷疑問題在於數據庫的大小,因爲我有類似的表達式訪問數據量較大的6倍,它需要400毫秒。我認爲它的選擇......但實際上我不知道。 – Manog

回答

0

我已經解決了這個問題。該查詢是正確的。問題在於「where」語句。它檢查了沒有索引集的列「createDate」。我設置了索引,整個頁面在500毫秒後準備就緒。謝謝大家的努力。

0

你的問題出在那裏說結束:.ToList() 我建議你刪除它,我建議使用PLINQ(並行LINQ)代替,所以你的查詢會是這樣:

var q = from order in db.Orders.AsParallel() 
     where order.CreateDate > d && order.Status > 3 
     join orderitems in db.OrderItems.AsParallel() on order.OrderId equals orderitems.OrderId 
     join customers in db.Customers.AsParallel() on order.CustomerId equals customers.CustomerId 
     orderby order.Price descending 
     select new { Coloumn_name = value, Column_name = value }; 
    var FinalList = q.Take(10); 
// Choose the column names you want, and assign the value you want i.e. order.CreateDate 
// so the select will be: select new {Create_Date = order.CreateDate, Client_Id = order.CustomerId ...etc};