C# LINQ多个group by,然后获取第一个group by值计数

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

我有一个类似followin的linq查询:

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((最大,当前)=>最大交易日期