LINQ的嵌套组

Nan*_*du 24 c# sql linq group-by

我无法使用LINQ查询解决此问题.

所以我们有如下表结构:Id || bug_category || bug_name || bug_details || bug_priority

我想先通过bug_category进行分组.对于每个bug_category,我想反过来按bug_priority分组.

所以我基本上想要这样的东西:

bug_category = AUDIO ::没有BUGS - > Critical = 3,Medium = 2和Low = 7个bug.
bug_category = VIDEO ::没有BUGS - > Critical = 5,Medium = 1和Low = 9个bug.

以下查询返回类别AND customer_priority的所有唯一组合:

(其中RawDataList只是具有上述结构的数据列表)

        var ProceesedData = from d in RawDataList
                      group d by new { d.bug_category, d.bug_priority } into g
                      select new
                      {
                          g.Key.bug_category,
                          g.Key.bug_priority
                      };
Run Code Online (Sandbox Code Playgroud)

以下查询返回该类别,后跟该类别中的记录列表:

            var ProceesedData = from d in RawDataList
                      group d by d.bug_category into g
                      select new { g.Key, records = g
                      };
Run Code Online (Sandbox Code Playgroud)

但是我无法继续进行,因为ProcessedData(返回变量)是一个未知类型.有什么想法吗?

Aar*_*nLS 30

这是完成嵌套分组的更简单方法.我已经在内存集合中对其进行了测试,无论您的特定数据库提供程序是否能够很好地处理它,或者它是否表现良好都是未知的.

假设你有两个属性,并希望按州和国家分组:

var grouped = People
  .GroupBy(l => new { l.State, l.Country})//group by two things
  .GroupBy(l=> l.Key.Country)//this will become the outer grouping


foreach(var country in grouped)
{
  foreach(var state in country)
  {
     foreach(var personInState in state)
     {
       string description = $"Name: {personInState.Name}, State: {state.StateCode}, Country: {country.CountryCode}";
       ...

     }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很难找到的答案! (3认同)

Jon*_*eet 29

我怀疑你想要(名字改为更惯用):

var query = from bug in RawListData
            group bug by new { bug.Category, bug.Priority } into grouped
            select new { 
                Category = grouped.Key.Category,
                Priority = grouped.Key.Priority,
                Count = grouped.Count()
            };
Run Code Online (Sandbox Code Playgroud)

然后:

foreach (var result in query)
{
    Console.WriteLine("{0} - {1} - {2}",
                      result.Category, result.Priority, result.Count);
}
Run Code Online (Sandbox Code Playgroud)

或者(但稍后见):

var query = from bug in RawListData
            group bug by new bug.Category into grouped
            select new { 
                Category = grouped.Category,
                Counts = from bug in grouped
                         group bug by grouped.Priority into g2
                         select new { Priority = g2.Key, Count = g2.Count() }
            };

foreach (var result in query)
{
    Console.WriteLine("{0}: ", result.Category);
    foreach (var subresult in result.Counts)
    {
        Console.WriteLine("  {0}: {1}", subresult.Priority, subresult.Count);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,这将导致多个SQL查询.要获得类似的结果结构,但更有效率,您可以使用:

var dbQuery = from bug in RawListData
              group bug by new { bug.Category, bug.Priority } into grouped
              select new { 
                  Category = grouped.Key.Category,
                  Priority = grouped.Key.Priority,
                  Count = grouped.Count()
              };

var query = dbQuery.ToLookup(result => result.Category,
                             result => new { result.Priority, result.Count };


foreach (var result in query)
{
    Console.WriteLine("{0}: ", result.Key);
    foreach (var subresult in result)
    {
        Console.WriteLine("  {0}: {1}", subresult.Priority, subresult.Count);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 第二个查询将为每个组创建一个辅助查询,所以我认为更好的解决方案是第一个跟随ToLookup按类别 (2认同)
  • 不,它在主组和辅助组之间进行外部应用(在外部应用连接中使用主组键),因此在这种情况下为EF提供+1(与许多其他组一样) (2认同)

Bit*_*KFu 6

我想你正在寻找类似的东西:

    var processedData =
        rawData.GroupBy(bugs => bugs.bug_category,
            (category, elements) =>
            new
                {
                    Category = category,
                    Bugs = elements.GroupBy(bugs => bugs.bug_priority,
                                        (priority, realbugs) =>
                                        new
                                            {
                                                Priority = priority,
                                                Count = realbugs.Count()
                                            })
                });
    foreach (var data in processedData)
    {
        Console.WriteLine(data.Category);

        foreach (var element in data.Bugs)
            Console.WriteLine("  " + element.Priority + " = " + element.Count);
    }
Run Code Online (Sandbox Code Playgroud)

  • 比Jon Skeet多花9分钟来写你答案的危险;) (2认同)