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分组,然后按发布日期降序获得每组中的前两名。
任何想法?
ChrisWue在这里提供了一个很好的答案。如果这能解决你的问题,给他投票
强类型你的列表,然后使用GroupBy
, OrderBy
和Take
得到你的结果。
结果集的强类型如下:
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();
这是有效的,但我想知道这是最好的方法吗?最有效?