C# LINQ多个group by,然后获取第一个group by值计数
我有一个类似followin的linq查询:C# LINQ多个group by,然后获取第一个group by值计数,c#,asp.net,asp.net-mvc,linq,group-by,C#,Asp.net,Asp.net Mvc,Linq,Group By,我有一个类似followin的linq查询: var _transactionsList = TransactionsData .GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL }) .Select(pr => new TransactionsTabResults { ItemID = pr.Ke
var _transactionsList = TransactionsData
.GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL })
.Select(pr => new TransactionsTabResults
{
ItemID = pr.Key.ItemID,
Title = pr.Key.Title,
GalleryURL = pr.Key.GalleryURL,
ItemPrice = pr.OrderByDescending(a => a.TransactionDate).First().ItemPrice,
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
}).ToList();
我正试图通过如下方式对其进行分组,以获取已售出商品的总价值:
ItemID Sales ItemName
1 1 Item1
1 3 Item1
1 5 Item1
1 6 Item1
2 2 Item2
2 2 Item2
2 2 Item2
2 2 Item2
所需的输出将是:
ItemID Sales ItemName
1 15 Item1
2 8 Item2
我写的上面的查询给出了错误的总销售额值,它说:
TotalSoldItems = pr.Count(),
如何计算或汇总一个具有唯一ID的商品的所有销售额(这是我分组的依据)
我做错了什么???你用了不高兴的错误方式。每次都创建新的唯一对象。因此,您的
.GroupBy(x=>new{x.ItemID,x.Title,x.GalleryURL})
和选择(x=>new{Key=new{x.ItemID,x.Title,x.GalleryURL},Value=x})
的意思相同
如果您需要唯一Id,则仅按Id分组
TransactionsData
.GroupBy(x => x.ItemID)
.Select(pr => new TransactionsTabResults
{
ItemID = pr.Key,
Title = pr.First().Title,
GalleryURL = pr.First().GalleryURL,
ItemPrice = pr.OrderByDescending(a => a.TransactionDate).First().ItemPrice,
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
}).ToList();
建议
优化你的LINQ。您正在多次迭代集合。建议使用以下代码:
TransactionsData
.GroupBy(x => x.ItemID)
.Select(pr =>
{
var items = x.pr.ToArray;
var sum = items.Sum(y => y.ItemPrice);
return new TransactionsTabResults
{
ItemID = pr.Key,
Title = items[0].Title,
GalleryURL = items[0].GalleryURL,
ItemPrice = pr.Aggregate((max, cur)=>max.TransactionDate<cur.TransactionDate?cur:max).ItemPrice,
TotalSoldItems = items.Length,
TotalRevenuePerItem = sum,
AveragePrice = sum/items.Length,
};
}).ToList();
TransactionData
.GroupBy(x=>x.ItemID)
.选择(pr=>
{
var项目=x.pr.ToArray;
var sum=项目.sum(y=>y.ItemPrice);
返回新的TransactionsTabResults
{
ItemID=公共密钥,
标题=项目[0]。标题,
GalleryURL=项目[0]。GalleryURL,
ItemPrice=pr.Aggregate((最大,当前)=>最大交易日期