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中文网其他相关文章!