2016-06-20 49 views
1
model.mTable = m_ctx.Shop 
.Where(t => t.CustomerID== model.mFilter.CustomerID) 
.Select(f => new GroupedData 
    { 
     iGroupID = f.iCustomerID, 
     dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds), 
}) 
.OrderByDescending(f => f.dtGroupDt) 
.Take(2) 
.ToList(); 

商店是表和CustomerID是表的主鍵,但如果有大量的數據,然後這個查詢給我超時異常。有沒有什麼辦法來優化這個查詢?如何優化此LinQ查詢?

+0

是的。可能是他每天購買一些物品。確切的CustomerID是一種虛擬的東西。如果我說我需要它,假設5月10分鐘後刷新的實時數據! –

+1

如果您將訂單放在選擇之前,它是否會改變任何內容?但是,爲什麼每個日期時間部分都有一列,而不是一個'datetime'類型的'dtGroupDt'列? –

+1

在「選擇」之前使用'OrderByDescending(t => t.dtDate).ThenBy(t => t.dtStartTime)'可能會更快。 –

回答

1

有3件事情,應該幫助你在這裏:

1)聯合dtDatedtStartTime成一列,如果可能的話
2)創建於dtDate指數(見@TimothyStepansky評論),然後
3)重新排序如何執行您的查詢(未經測試,語法可能不完全正確):

model.mTable = m_ctx.Shop 
       .Where(t => t.CustomerID== model.mFilter.CustomerID) 
       .OrderByDescending(t => t.dtDate) 
       .ThenBy(t => t.dtStartTime) 
       .Select(f => new GroupedData 
       { 
        iGroupID = f.iCustomerID, 
        dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds), 
       }) 
       .Take(2) 
       .ToList();