我有一张桌子'帖子'以下列
- id (int)
- categoryId (int)
- itemVariant (sbyte)
- [... other post data columns..]
我正在尝试构建一个linq查询,该查询将生成一个列表,其中包含每个categoryId 中 itemNariants的前N个结果。
我试过了:
var res = (from o in db.posts
where o.id == d.id
group o by new
{
o.categoryId,
o.itemVariant
}
into groups
select groups).SelectMany(g => g.Take(n));
但是,每个类别返回一个结果。我认为我需要两个分组和一个子查询,但不知道如何实现这一点。
示例:
-Id: 2, categoryId: 1, itemVariant 1
-Id: 3, categoryId: 1, itemVariant 2
-Id: 4, categoryId: 1, itemVariant 1
-Id: 5, categoryId: 2, itemVariant 1
返回TOP 1项的查询应返回每个类别的两组帖子,每组有两组代表按itemVariant进行内部分组,一组用于类别2,itemVariant 1分组将包含Id = 5的行。类别1组将包括两个组(由于两个itemVariant选项),在第一组行Id = 2(或Id = 4,取决于我的排序,但让我们假设默认排序)和第二组ID = 3。
返回的分组应具有以下样本结构。
- Grouped Category 1
- Grouped ItemVariant 1
- Post 1 data
- Post 2 data
- Grouped Item Variant 2
- Post 3 data
- Grouped Category 2
- Grouped itemVariant 1
- Post 4 data
- Grouped itemVariant 2
- Post 5 data
查询可以在Entity Framework或Linq中。在Visual Studio 2015 / C#/ MySQL中开发。
答案 0 :(得分:1)
这样的东西?
var result = db.posts.GroupBy(post => post.categoryId,
(categoryId, categoryPosts) => new { categoryId,
itemVariants = categoryPosts.GroupBy(post => post.itemVariant,
(itemVariant, itemVariantPosts) => new { itemVariant,
topPosts = itemVariantPosts.Take(n)
})
});