linq 从分组值返回列表

dzhpxtsq  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(159)

我想制作一个包含前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?>'

jmo0nnb3

jmo0nnb31#

您已经接近了。您的分组包含每个项目ID的订单集合。将列表缩减到前10个组后,您需要提取所需的项目。由于组关键字仅包含项目ID,因此您需要深入到订单集合,选择一个(任何都可以),然后选择链接的项目对象。
结果将是项目列表,而不是订单列表。
试试看:

public List<Item> GetBestsellingItems()
        {
            var result = context.Order
                .Include(p => p.Item)
                    .GroupBy(p => p.ItemId)
                    .OrderByDescending(g => g.Sum(p => p.AmountOrdered))
                    .Take(10)
                    .Select(g => g.First().Item)
                    .ToList();

            return result;
        }

我省略了.Where(p => p.ItemId == p.Item.ItemId)操作,因为我不相信它会做任何事情,如果测试失败,您就有了一些严重的数据库完整性问题。
如果您还想返回计算出的金额以及项目,则需要将返回类型更改为元组或自定义对象的列表,然后让.Select(...)使用项目和计算出的金额构造每个示例。

相关问题