如何使用linq进行嵌套组?

时间:2014-05-14 21:27:40

标签: c# asp.net sql linq group-by

我正在尝试按以下顺序对结果进行分组。

我想要属于学校团队条目。 我的Entry模型通过FK链接到User。 我的入门模型与FK团队有关。 团队通过m2m链接到User。 用户通过FK链接到School。

我当前的查询如下所示:

var y =
                    (from en in _db.Entries
                     where en.User.School_Id == schoolId
                     group en by en.Team_Id into te
                     select new
                     {
                         Team = te.Key,
                         Entries = te
                     }).ToList();

这将完美地返回团队和团队下方的相应条目。

Teams
|
-Team A
--|
  Entries
   |
   -Entry 1
   -Entry 2

如何在学校分组中嵌套这一切? (在演示中,我只是指定了一个学校ID,但在实践中会有一个与之匹配的学校ID列表。)

-Schools
|
-School A
 -|
 -Teams
 -Team A
   |
   -Entries 
     |-Entry 1
     |-Entry 2

我想将它直接绑定到gridview。 这样做效果很好但是通过额外的分组,我有点不确定它是如何影响这个标记的。

                <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">
                    <Columns>

                        <asp:BoundField HeaderText="School" DataField="School" />
                        <asp:BoundField HeaderText="Team" DataField="Team" />
                        <asp:TemplateField HeaderText="Entries">
                            <ItemTemplate>
                                <asp:BulletedList ID="BulletedList1" runat="server"
                                    DataSource='<%#Eval("Entries")%>' DataValueField="Name" />
                            </ItemTemplate>
                        </asp:TemplateField>

                    </Columns>
                </asp:GridView>

更新: Here is a diagram of the models

1 个答案:

答案 0 :(得分:0)

尝试使用此代码,它将返回每个团队的条目集合:

var ColEntries = _db.Teams.GroupJoin(_db.Entries,     
                                      t => t.Team_ID,   
                                      e => e.Team_ID,      
                                      (t, e) =>       
                                      new { 
                                              Team = t,
                      Entries = e.Select(en => en).ToList()
                                           }).ToList(); 

这将适用于每所学校并获得团队及其参赛作品

_db.Schools.foreach(s=> 
{
   //Fine a collection say "col" 
  var y = _db.Entries.Where(e=> e.User.School_ID = s.School_ID).GroupBy(e=> e.Team_ID).ToList();

  col.Add(y);
});

我希望它有所帮助