我有一个这样的产品表:-
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
的产品都具有相同的Name
和Bar
。如果不是这种情况,并且您想映射所选实体的所有属性,请在
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/