c# Linq -从每组选择前2名

本文关键字:选择 2名 Linq | 更新日期: 2023-09-27 18:17:55

我需要获取每个ProductTypeName:

的前2个产品
var productDetails = (from p in products
                            join po in productOrganisations 
                            on p.Id equals po.ProductId
                            where po.OrganisationId == id
                            where p.ProductTypeId == (typeId > 0 ? typeId : p.ProductTypeId) //filter by type if specified
                            where p.IsLive
                            select new
                            {
                                Id = p.Id,
                                Name = p.Name,
                                SupplierName = p.Supplier.Name,
                                ProductTypeName = p.ProductType.Name,
                                ShortDescription = p.ShortDescription,
                                ProductTypeId = p.ProductTypeId,
                                DatePublished = p.DatePublished,
                                CurrencyId = p.CurrencyId,
                            })
                            .AsNoTracking()
                            .ToArray();

目前上面的语句返回我所有的产品,数百。每个产品都有一个属性ProductTypeName。

我需要按这个ProductTypeName分组,然后按发布日期降序获得每组中的前两名。

任何想法?

c# Linq -从每组选择前2名

ChrisWue在这里提供了一个很好的答案。如果这能解决你的问题,给他投票

强类型你的列表,然后使用GroupBy, OrderByTake得到你的结果。

结果集的强类型如下:

List<ProductDetails> myProductList = (from p in products
                        join po in productOrganisations 
                        on p.Id equals po.ProductId
                        where po.OrganisationId == id
                        where p.ProductTypeId == (typeId > 0 ? typeId : p.ProductTypeId) //filter by type if specified
                        where p.IsLive
                        select new
                        {
                            Id = p.Id,
                            Name = p.Name,
                            SupplierName = p.Supplier.Name,
                            ProductTypeName = p.ProductType.Name,
                            ShortDescription = p.ShortDescription,
                            ProductTypeId = p.ProductTypeId,
                            DatePublished = p.DatePublished,
                            CurrencyId = p.CurrencyId,
                        })
                        .AsNoTracking()
                        .ToList();

然后像这样查询列表:

List<ProductDetail> finalResult = 
                     myProductList.GroupBy(p => p.ProductTypeName)
                     .SelectMany(d => d.OrderBy(r => r.DatePublished.Take(2))
                     .ToList();

对于任何有同样问题的人,我最终通过使用:

.GroupBy(x => x.ProductTypeId)
.SelectMany(x => x.Take(2))

完整的例子是:

var productDetails = (from p in products
                            join po in productOrganisations 
                            on p.Id equals po.ProductId
                            where po.OrganisationId == id
                            where p.ProductTypeId == (typeId > 0 ? typeId : p.ProductTypeId) //filter by type if specified
                            where p.IsLive
                            select new
                            {
                                Id = p.Id,
                                Name = p.Name,
                                SupplierName = p.Supplier.Name,
                                ProductTypeName = p.ProductType.Name,
                                ShortDescription = p.ShortDescription,
                                ProductTypeId = p.ProductTypeId,
                                DatePublished = p.DatePublished,
                                CurrencyId = p.CurrencyId,
                            })
                            .GroupBy(x => x.ProductTypeId)
                            .SelectMany(x => x.Take(2))
                            .AsNoTracking()
                            .ToArray();

这是有效的,但我想知道这是最好的方法吗?最有效?