1

我有一个列出代理、联系人和组的数据表,最终结果将通过列表绑定到转发器控件。到目前为止,我能够提取我需要的信息,但是在获取代理和联系人的不同值时遇到了麻烦。有重复的机构以及具有一个或多个组的联系人。

它应该类似于以下结构:

Agency1 
   Jenny    |  Basketball, Dance
   Bill     | Football, Ballet
Agency2
   Archie   |  Soccer, Band

到目前为止,我有这个:

var groups = dt.AsEnumerable()
.GroupBy(r => new
{
    Agency = r.Field<string>(("Agency")),
   //Contact = r.Field<string>("POC") ,
   //Groups = r.Field<string>("POC_Name")
});


List<alist> agencyAdd = new List<alist>();
foreach (var agencyContactGroup in groups)
{
    agencyAdd.Add(new alist()
    {

      Agency = agencyContactGroup.Key.Agency,
      Contact = string.Join("<br>", agencyContactGroup.Select(r => r.Field<string>("POC")))
              + string.Join(",",  agencyContactGroup.Select(g => g.Field<string>("POC_Name")))
    });
}

在 .aspx 方面:

<asp:Repeater runat="server" ID="AgencyRepeater">
<HeaderTemplate> <h2>Agency:</h2> </HeaderTemplate>
<ItemTemplate>
    <table>
        <tr>
          <td><h3><b><%# DataBinder.Eval(Container.DataItem, "Agency") %></b></h3></td>
        </tr>
        <tr>
          <td>
             <b><%# DataBinder.Eval(Container.DataItem, "Contact") %></b>
             <b><%# DataBinder.Eval(Container.DataItem, "Groups") %></b>
          </td>
        </tr>
    </table>   
</ItemTemplate>
</asp:Repeater>

有人可以指出我正确的方向。谢谢。

4

2 回答 2

1

使用带有嵌套转发器/列表视图控件的 linq group by。您可以使用 linqIGrouping Key属性来显示组头,并且项目可以是任何类型。这是如何将其应用于您的场景的示例。希望这会有所帮助。

Groupings.DataSource = agencyAdd.GroupBy(a=> a.Agency.Name);
Groupings.Databind();

<asp:ListView ID="Groupings" runat="server" ViewStateMode="Disabled" EnableViewState="false">
    <LayoutTemplate>
        <Table>
              <tbody>
            <asp:PlaceHolder runat="server" ID="ItemPlaceHolder" />
              </tbody>
        </Table>
    </LayoutTemplate>
    <ItemTemplate>
        <!-- group header -->
        <tr><td colspan="3"><%# Eval("Key") %></td></tr> 

        <!-- group items -->
        <asp:ListView ID="GroupItems" runat="server" DataSource='<%# Container.DataItem %>' ViewStateMode="Disabled" EnableViewState="false">
        <LayoutTemplate>
           <asp:PlaceHolder runat="server" ID="ItemPlaceHolder" />
        </LayoutTemplate>
            <ItemTemplate>
              <tr>
                <td> </td>
                </td><%# DataBinder.Eval(Container.DataItem, "Contact") %></td>
                </td><%# DataBinder.Eval(Container.DataItem, "Groups") %></td>
              </tr>
            </ItemTemplate>
    </ItemTemplate>     
</asp:ListView> 
于 2013-10-22T21:50:35.960 回答
0

分组查询应该是这样的:

dt.AsEnumerable()
.GroupBy(r => r.Field<string>("Agency"))
.Select(g => 
    new AgencyDto { 
          Agency = g.Key,
          Contacts = g.GroupBy(r1 => r1.Field<string>("POC"))
            .Select(g1 => 
              new ContactDto { 
                    Contact = g1.Key, 
                    Groups = string.Join(",", g1.Select(r2 => r2.Field<string>("POC_Name")))
                  })
        })

因此,Agency首先有一个分组,在这些组中,有 的组Contacts,它们Groups连接为一个逗号分隔的字符串。

我假设您将创建AgencyDtoContactDto类型。

于 2013-10-22T18:54:31.947 回答