我想制作一个包含前10名畅销商品的表。但是,当我在查询中使用GroupBy时,无法返回列表。
下面是我在数据库上测试的SQL语句:
SELECT itemId, SUM(amountOrdered) AS amount FROM order GROUP BY itemId ORDER BY amount desc LIMIT 10;
这是我在我的项目中如何处理的:
public List<Order?> GetBestsellingItems()
{
var result = context.Order
.Include(p => p.Item)
.Where(p => p.ItemId== p.Item.ItemId)
.GroupBy(p => p.ItemId)
.OrderByDescending(g => g.Sum(p => p.AmountOrdered))
.Take(10)
.ToList();
return result;
}
我得到的错误是:Cannot implicitly convert type System.Collections.Generic.List<System.Linq.IGrouping<int, Project.Models.Order>>' to 'System.Collections.Generic.List<Project.Models.Order?>'
1条答案
按热度按时间jmo0nnb31#
您已经接近了。您的分组包含每个项目ID的订单集合。将列表缩减到前10个组后,您需要提取所需的项目。由于组关键字仅包含项目ID,因此您需要深入到订单集合,选择一个(任何都可以),然后选择链接的项目对象。
结果将是项目列表,而不是订单列表。
试试看:
我省略了
.Where(p => p.ItemId == p.Item.ItemId)
操作,因为我不相信它会做任何事情,如果测试失败,您就有了一些严重的数据库完整性问题。如果您还想返回计算出的金额以及项目,则需要将返回类型更改为元组或自定义对象的列表,然后让
.Select(...)
使用项目和计算出的金额构造每个示例。