LINQ:GroupBy、Sum與Count
問題描述
您有一組產品數據,需要依照產品代碼分組。對於每個代碼,您希望傳回一個包含產品名稱、產品數量和總價格的物件。您正在使用LINQ的GroupBy和SelectMany函數來實現此目標,但是結果物件中的數量屬性始終為1。
解
問題在於SelectMany函數用於處理每個組中的每一項。若要解決此問題,請使用Select代替。
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }) .ToList();</code>
替代方案
或者,您可以同時按產品名稱和產品代碼進行分組,如果給定代碼的名稱始終相同,則會得到相同的結果。這可以在EF中產生更好的SQL:
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => new { l.ProductCode, l.Name }) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }) .ToList();</code>
改進資料型別
考慮將Quantity和Price屬性分別改為int和decimal類型,因為這更能反映這些值的性質。
以上是如何正確使用LINQ的GroupBy、Sum、Count來聚合產品資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!