我有一个这样的产品表:-

ProductID     ProductName     Price
   1            Milk           10
   2            Banana         20
   3            Apple          15
   1            Grapes         12
   2            Banana         25
   1             Milk          8

我想找到每个productId的价格最高的产品。

样本输出:-
    ProductID     ProductName     Price
       1            Grapes          12
       2            Banana         25
       3            Apple          15

我已经尝试过此查询:
List<Product> groups = products
    .GroupBy(p => p.ProductId)
    .Select(p => new Product
        {
            ProductId = p.Key,
            Name = p.OrderByDescending(o => o.Price).First().Name,
            Price = p.OrderByDescending(o => o.Price).First().Price,
        })
    .ToList();

这个查询工作正常,但是我的问题是我应该两次使用OrderByDescending吗?我的意思是因为我只想基于1个属性的单个项目,并假设还有多个其他属性,所以我需要一次又一次地使用相同的逻辑吗?

编辑:
请原谅我忘了提,请假设ProductName可以不同,请检查更新的表。

最佳答案

不,您不必这样做,只需选择First()即可:

new Product
{
    ProductId = p.Key,
    Name = p.First().Name,
    Bar = p.First().Bar,
    Price = p.OrderByDescending(o => o.Price).First().Price,
}

当然,这假定所有具有给定ProductId的产品都具有相同的NameBar

如果不是这种情况,并且您想映射所选实体的所有属性,请在Select()中创建一个代码块:
.Select(p =>
{
    var havingHighestPrice = p.OrderByDescending(o => o.Price).First()

    return new Product
    {
      ProductId = p.Key,
      Name = havingHighestPrice.Name,
      Bar = havingHighestPrice.Bar,
      Price = havingHighestPrice.Price,
    }
})

关于c# - 我应该在LINQ中两次使用OrderByDescending吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27442593/

10-11 22:49
查看更多