聲明:我幾乎沒有linq的使用經驗。需要幫助優化Linq環路
我的工作之一是維護一個電子商務網站。昨天,我們的一位客戶開始抱怨當他們嘗試爲Google創建Feed文件時發生超時。事實證明,如果用戶有超過9,000個項目需要放入其供稿文件,我們的代碼至少需要一分鐘才能執行。
我無法通過運行調試程序找到問題的根源,所以我啓動了一個分析器(ANTS)並讓它執行它的操作。它找到了我們問題的根源,一個包含一些linq代碼的foreach循環。這裏是代碼:
var productMappings = GoogleProductMappingAccess.GetGoogleProductMappingsByID(context, productID);
List<google_Category> retCats = new List<google_Category>(numCategories);
int added = 0;
//this line was flagged by the profiler as taking 48.5% of total run time
foreach (google_ProductMapping pm in (from pm in productMappings orderby pm.MappingType descending select pm))
{
if (pm.GoogleCategoryId.HasValue && pm.GoogleCategoryId > 0)
{
//this line was flagged as 36% of the total time
retCats.Add(pm.google_Category);
}
else if (pm.GoogleCategoryMappingId.HasValue && pm.GoogleCategoryMappingId > 0)
{
retCats.Add(pm.google_CategoryMapping.google_Category);
}
else
{
continue;
}
if (++added >= numCategories)
{
break;
}
}
做任何你更有經驗的開發者有什麼想法嗎?我在嘗試用sql替換所有的linq,但我不確定這是否是這裏最好的操作過程(如果它是用linq編寫的,必須有它的原因)。
不要在循環中執行linq。將結果存儲在一個變量中並使用它。 – madmik3 2011-02-28 23:15:45
快速修復DataContext.CommandTimeout。 – 2011-03-01 00:45:26
可能不必這樣做。如果可能的話儘量避免它 – CountMurphy 2011-03-01 00:48:11