2014-04-03 43 views
1

我想優化以下LINQ語句的性能還是需要一些替代品可能執行更高效的方式交替...優化或LINQ(爲aggreation)C#

var temp = (from r in jc 
      group r by new { r.City, r.Gender, r.AgeBracket } into g 
      select new Summary 
      { 
       Population = g.Sum(x => (decimal)x.Population), 
       State = g.Select(x => x.City).First(), 
       Gender = g.Select(x => x.Gender).First(), 
       AgeBracket = g.Select(x => x.AgeBracket).First() 
      }).ToArray(); 

請讓我知道任何替代LINQ執行此類操作的方法,因爲我觀察到LINQ在產生大量數據結果方面有相當大的性能開銷。

編輯-1 我不是從數據庫查詢它,但我有用於生成摘要的內存對象的自定義。

回答

4

相反的g.Select(xxx).First您可以使用g.Key.XXX

select new Summary 
    { 
     Population = g.Sum(x => (decimal)x.Population), 
     State = g.Key.City, 
     Gender = g.Key.Gender, 
     AgeBracket = g.Key.AgeBracket 
    } 
2

首先,LINQ是不是性能 - 它是關於便利。要了解它的表現如何,您需要進行配置。要做的第一件事就是要找出:

  • 什麼TSQL它產生
  • 是多少行返回
  • 它走多久在數據庫
  • 多久,它是執行在客戶端執行

如果TSQL看起來不錯,並且兩個定時大致相同,那麼您可能需要添加索引。如果TSQL很糟糕和/或在數據庫運行時間過長,那麼您可能需要手動滾動TSQL。如果數據庫時間沒有問題,但在.NET中執行需要花費大量時間,那麼它可能是一個映射器故障(有時會發生) - 考慮像dapper這樣的工具。如果僅僅是行數:想象一個新的設計;也許是分頁。

優化沒有一個答案。首先你需要確定瓶頸。

+0

感謝您的寶貴意見,但在我的情況下,我在記憶對象查詢。我忘了在我的問題中提到這一點。反正你的觀點是有幫助的。謝謝 – ak1

+0

其次,我正在尋找任何可能的替代使用LINQ,你有什麼想法? – ak1

+1

@asif raw TSQL和「dapper」 –

0

你可以用老式的方式:)按城市,性別,年齡排序jc。迭代排序結果總和。當城市,性別,年齡變化時,輸出與之前的城市,性別,年齡和總和的總結。將總和重置爲零並繼續。

+0

謝謝,我也會嘗試。 – ak1