2012-11-18 52 views
1

我希望在確定使用Linq to Entities進行應用程序的正確方法方面提供任何幫助。特別是,當處理多個多對多表格時,我很難理解分組。Linq to Entities - 使用group by來創建多對多的表格

簡化數據庫設計是:

http://imageshack.us/a/img443/5863/entitydesignerdiagram.png

DB設計理念:

人:即有機會獲得編輯多個統計個別人。 季節:按2012年棒球或2012年統計的時間段。玩家:參與統計的個人或gorup。這裏所需要的只是實體的名稱。如Kevin Wasie或Varsity Team 統計數據:包含屬於一個賽季的個人統計信息,例如達陣或家庭運行。

代碼背後:

Dim stats = From st In pl.statistics From per In st.people 
     Where per.id.Equals(personID) 
     Select New With 
      {.season_name = st.season.name, .statistic_name = st.name, .season_id = st.season.id, 
      .players = From play In pl.players 
          Where play.seasonId = st.season.id 
          Select New With {.player_name = play.name}} 

    rep_statistics.DataSource = stats 
    rep_statistics.DataBind() 

的.aspx:

<asp:Repeater ID="rep_actions" runat="server"> 
<HeaderTemplate> 
</HeaderTemplate> 
<ItemTemplate> 
<b><%# Eval("season_name")%></b> - <%# Eval("statistic_name")%><br /> 
    <asp:Repeater ID="rep_part" runat="server" DataSource='<%# Eval("players")%>'> 
    <itemtemplate> 
    <%# Eval("participantname")%> 
    </itemtemplate> 
    <SeparatorTemplate>,</SeparatorTemplate> 
    </asp:Repeater> 
</ItemTemplate> 
</asp:Repeater> 

期望得到的結果是讓頁面由賽季如此顯示的分組:

Season 1 
    Statistic 1 
     Season1 Players 
    Statistic 2 
     Season1 Players 
    Statistic 3 
     Season1 Players 
Season 2 
    Statistic 4 
     Season 2 Players 
... 

目前的結果是:

Season 1 
    Statistic 1 
     Season1 Players 
Season 1 
    Statistic 2 
     Season1 Players 
Season 1 
    Statistic 3 
     Season1 Players 
Season 2 
    Statistic 4 
     Season 2 Players 
... 

如何修改linq以獲得期望的結果?

任何幫助,包括教程或其他信息的鏈接,將不勝感激。先謝謝你!

+0

現在的結果是什麼。無論如何,db結構看起來不太好。人與玩家之間應該有直接的關係。 –

+0

結果現在是:Season1/Statistic1/Season1Players> Season1/Statistic2/Season1Players ...我想它是Season1/Statitic1/Season1Players> Statistic2/Season1Players等... 數據庫設計:玩家和人是兩個不同的事情:玩家可以是個人或團隊,因此玩家表所需要的只是該季節涉及的實體的名稱。人員表是可以訪問多個統計信息進行編輯的個人。在實際設計中,我確實有一個人口統計表來存放人口統計數據,但爲簡單起見,此處不再贅述。 –

回答

3

下面是C#代碼,但我希望它會給你提示你需要做什麼。 查詢過濾給定Id的人員並使用SelectMany()爲這些人員選擇統計信息。

然後,它將所選統計信息按SeasonId進行分組,並填充要輸出季節的集合。

var data = st.People 
      .Where(p => p.Id == personID) 
      .SelectMany(p => p.Statistics) 
      .GroupBy(s => s.SeasonId) 
      .Select(g => new 
      { 
       SeasonId = g.Key, 
       SeasonName = g.Fist().Season.Name, 
       Statistics = g.Select(s => new 
           { 
            StatisticId = s.Id, 
            StatisticName = s.Name, 
            Players = s.Season.Players 
           }) 
      }); 
+0

謝謝!還有一點需要注意的是:我試圖訪問像'code' Key這樣的球員列.Players = s。[Select](Function(k)New With {Key .PlayerName = s.Season.Player.Name'code'這不起作用,因爲我得到的錯誤:「重載解析失敗,因爲沒有可訪問的'選擇'可以用這些參數調用」任何想法如何解決? –

+0

'選擇'方法可以應用於集合。一個單一的項目。 – RePierre