多个嵌套的GroupBy将表格数据转换为类

时间:2018-06-18 04:42:49

标签: c# linq nested

我的数据采用表格格式,如

    ID | Category  | Group  | Platform | Count
   --------------------------------------------        
    1  | Accepted  | Public | Windows  | 20

    1  | Completed | Debug  | Mac      | 15

等等。这些值的每个唯一组合将有一行(即,相同的ID可以有许多类别,并且Cateogories可以有许多组,并且组可以有许多平台等。

我有一个类,我想把它映射到我从一个只有一个字符串Platform和一个Count的类开始。然后有一个类有一个字符串Group和一个平台列表,然后是一个具有字符串Category和List of Group的类,依此类推。

我试图弄清楚如何将数据分组为可以在C#中解析为此类的格式。我目前正在这样做:

var data = falloffData.GroupBy(sk => new { sk.SID})
    .Select(sg => new
    {
        SID = sg.Key.SID,
        Group = sg.GroupBy(ak => new { ak.AGroup })
        .Select(ag => new
        {
            AGroup = ag.Key.AGroup,
            Category = ag.GroupBy(ck => new { ck.Category })
            .Select(cg => new
            {
                Category = cg.Key.Category,
                Platform = cg.GroupBy(pk => new { pk.Platform })
                .Select(pg => new
                {
                    Platform = pg.Key.Platform,
                    Count = pg.Sum(c => c.TotalCount)
                })
            })
        })
    });

这组合正确,但我最终得到的IEnumerable有很多匿名类型,如:

  

{AGroup =“Production”,Category =   {System.Linq.Enumerable.WhereSelectEnumerableIteratorf__AnonymousType4,   Scratch.Program.FalloffItem>,<> f__AnonymousType5f__AnonymousType7>>>}}

我不知道如何将其解析为我的C#类。

任何指针?

谢谢!

1 个答案:

答案 0 :(得分:0)

你得到了很多匿名类型,因为你创建了很多匿名类型。

如果要选择/投影到具体类,则需要选择它们而不使用匿名类型。

鉴于您的课程

internal class SomePlatform
{
  public string Platform { get; set; }
  public int Count { get; set; }
}

internal class SomeCategory
{
  public string Category { get; set; }
  public IEnumerable<SomePlatform> Platforms { get; set; }
}

internal class SomeGroup
{
  public string AGroup { get; set; }
  public IEnumerable<SomeCategory> Categorys { get; set; }
}

internal class SomeClass
{
  public string SID { get; set; }
  public IEnumerable<SomeGroup> Groups { get; set; }
}

投影示例

blah.GroupBy(sk => sk.SID) // Group
    .Select(sg => new SomeClass // Select into SomeClass
    {
      SID = sg.Key.SID,
      Groups = sg.GroupBy(ak => ak.AGroup) // Group
                .Select(ag => new SomeGroup // Select into SomeGroup
                 {
                    AGroup = ag.Key.AGroup,
                    Categorys = ag.GroupBy(ck => ck.Category)  // Group
                                 .Select(cg => new SomeCategory  // Select into SomeCategory
                                  {
                                     Category = cg.Key.Category,
                                     Platforms = cg.GroupBy(pk => pk.Platform) // Group
                                                  .Select(pg => new SomePlatform // Select into SomePlatform
                                                   {
                                                      Platform = pg.Key.Platform,
                                                      Count = pg.Sum(c => c.TotalCount)
                                                   })
                                  })
                 })
    });