【问题标题】:Linq to Entities - using group by for many-to-many tablesLinq to Entities - 对多对多表使用 group by
【发布时间】:2012-11-18 04:38:36
【问题描述】:

在确定将 Linq to Entities 用于我的应用程序的正确方法方面,我将不胜感激。具体来说,在处理多个多对多表时,我很难理解分组。

简化的数据库设计是:

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

数据库设计理念:

人员:有权编辑多个统计信息的个人。 季节:分组统计数据的时间段,例如 2012 年棒球或 2012 年。 参与者:参与统计的个人或群体。这里需要的只是实体的名称。比如 Kevin Wasie,或者 Varsity Team 统计数据:保存属于 1 个赛季的个人统计信息,例如达阵或本垒打。

代码背后:

    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 以获得所需的结果?

任何帮助,包括指向教程或其他信息的链接,将不胜感激。提前谢谢!

【问题讨论】:

  • 现在的结果是什么。无论如何,db结构看起来不太好。人和玩家之间应该有直接的关系。
  • 现在的结果是:Season1/Statistic1/Season1Players > Season1/Statistic2/Season1Players ... 我希望它是 Season1/Statitic1/Season1Players > Statistic2/Season1Players 等... DB 设计:球员和人是两个不同的东西:球员可以是个人,也可以是球队,所以球员表所需要的只是那个赛季所涉及的实体的名称。人员表是可以访问多个统计信息以进行编辑的个人。我在实际设计中确实有一个人口统计表来保存人口统计数据,但为了简单起见,将其留在这里。

标签: asp.net vb.net linq entity-framework


【解决方案1】:

下面是 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
                               })
             });

【讨论】:

  • 谢谢!还有一个警告:我正在尝试访问像 code Key .Players= s.[Select](Function(k) New With {Key .PlayerName = s.Season.Player.Name code 这样的玩家列这不起作用,因为我收到错误消息:“重载解析失败,因为无法使用这些参数调用可访问的'Select'”任何想法如何解决这个问题?
  • Select 方法可以应用于集合。 s 是单个项目。
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 2021-12-09
  • 2011-05-14
  • 2011-04-12
  • 2012-01-15
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多