2010-09-17 56 views
0

我做了我正在運行的程序的一些分析和最花費時間的越來越從LINQ查詢結果的事情:通過分組linq結果的過程非常緩慢,任何提示?

var Results = 
    from a in Table 
    group a by a.Value into b 
    select new {Group = b}; 

foreach(var Result in Results) 
{ 
    //Do calcs 
} 

我如何能加快這任何想法?

+2

我不認爲這裏有足夠的信息。表是什麼?它是否在進行數據庫調用?什麼花了很長時間?只是foreach循環?或者什麼是foreach? – Bryan 2010-09-17 20:20:01

+1

看起來像'select new {Group = b}'可能只是'選擇b',但是不會加快速度。 – 2010-09-17 20:21:46

+0

分組可能是一項昂貴的操作。如果Table在數據庫中,它是否具有Value上的索引? – 2010-09-17 20:23:37

回答

2

我想你是查詢對象與該查詢的結果混淆。你的第一個變量不包含結果,它包含一個查詢對象。此時查詢尚未執行。執行被延遲直到你真正需要結果,並且在你的例子中,當你在foreach循環中進行迭代時,這是完成的。這就是爲什麼第一個語句執行得很快但迭代很慢。

如果要將查詢結果存儲在results中,以便它們在您開始foreach循環時已經計算出來,請向ToList()添加一個調用。

var results = 
    (from a in Table 
    group a by a.Value into b 
    select new {Group = b}).ToList(); 
+0

但是這會使它(整個發佈的代碼)更快嗎? – 2010-09-17 20:22:43

+1

我懷疑它,但要確定你應該測量。它會做的是預先執行成本,以便迭代更快。在我看來,OP的擔心更多的是迭代速度驚人地慢,而不是代碼的總運行時間太慢。如果你不確定幕後發生了什麼,那麼你可能會認爲第一行是慢的,而且循環要快。 – 2010-09-17 20:31:39

+1

我有一個列表128000項。有它按照productid分組。做了鑰匙的地方,然後跑過去。它花了0.10秒。在IEnumerable >上完成ToList後,時間爲0.0002秒。不知道這是在屏幕上隱藏。但它造成了很大的不同。 – mimo 2013-09-18 11:31:15

0

如果您使用.NET 4,看看P-LINQParallel ForEach循環。這應該會顯着提高性能。

根據給出的信息無法真正辨別,但可能是SQL查詢花費的時間太長?

如果是ForEach循環確實會導致瓶頸,那麼Parallel ForEach將是您最好的選擇。

+0

如果是I/O綁定(數據庫),一些額外的線程不會有太大的幫助。我認爲這取決於(不可用的細節)。 – 2010-09-17 20:25:15

+0

這隻會對LINQ到對象有一個潛在的改進,但如果這是使用IQueryable ,它不會(多),因爲瓶頸可能在後端。 – 2010-09-17 20:26:04

+0

@Reed,是的,就像Henk說的那樣,它完全基於不可用的細節。如果Calcs在foreach循環中完成是問題,這將有所幫助,或者即使LINQ語句針對的是對象集合,但我們並不知道給出的信息。 – 2010-09-17 20:30:31

0

我只有2000個用於MSChart的Sqlite記錄(索引)有同樣的問題,顯然這是由LINQ組語句查詢所有記錄引起的。

我發現的唯一解決方案是回到原生SQL,並且使用LINQ和SQlite,圖表瞬間呈現,而不是2秒。