我有这样的产品表: -
ProductID ProductName Price
1 Milk 10
2 Banana 20
3 Apple 15
1 Grapes 12
2 Banana 25
1 Milk 8
我想找到每种产品的最高价格的产品。
示例输出: -
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可以不同,请检查更新的表格。
答案 0 :(得分:5)
不,你不必,你可以选择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,
}
})
答案 1 :(得分:1)
您可以使用Linq查询语法来存储局部变量:
var groups = from p in products.GroupBy(x => x.ProductId)
let first = p.OrderByDescending(o => o.Price).First()
select new Product
{
ProductId = p.Key,
Name = first.Name,
Price = first.Price,
};
重要的是,在实体框架查询中使用它是安全的。