返回N的Linq查询结果来自两个分组列

时间:2015-11-12 09:35:01

标签: sql entity-framework linq

我有一张桌子'帖子'以下列

- 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中开发。

1 个答案:

答案 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)
            })
    });