我有一个数据表,列出了代理商,联系人和组,最终结果将通过列表绑定到转发器控件。到目前为止,我能够提取我需要的信息,但却无法获得代理商和联系人的独特价值。有重复的代理商以及具有一个或多个组的联系人。
它应该类似于这种结构:
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>
有人能指出我正确的方向吗?感谢。
答案 0 :(得分:1)
使用linq group by,使用嵌套的repeater / listview控件。您可以使用linq IGrouping
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>
答案 1 :(得分: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
连接为逗号分隔的字符串。
我假设您要创建AgencyDto
和ContactDto
类型。