按对象列表中的项目分组(Sitecore 项目)并与 Repeater 绑定
Group by Items in list of objects (Sitecore Item) and bind with Repeater
抱歉,描述太长了,但我想让用户更容易理解我的问题。
我有一个包含 DepartmentItem
和 EmployeeItem
的列表。
var empSubRelList = new List<EmpDeptRel>();
internal class EmpDeptRel
{
public Item DepartmentItem { get; set; }
public Item EmployeeItem { get; set; }
}
下面是解释我如何向列表中添加项目的代码:
Item userProfile = Sitecore.Context.Database.GetItem("/sitecore/content/Intranet/User Profiles");
foreach (var subRelItem in userProfile.Axes.GetDescendants().Where(p => p.TemplateID.ToString() == Settings.GetSetting("SubRelTemplateID")
&& p["Subsidiary"] == SubssdiaryItem.ID.ToString()).OrderBy(p => p["Department"]))
{
empSubRelList.Add(new EmpDeptRel
{
DepartmentItem = GetItemById(subRelItem["Department"]),
EmployeeItem = subRelItem.Parent.Parent
});
}
我用中继器绑定:
repEmployees.DataSource = empSubRelList;
repEmployees.DataBind();
<asp:Repeater runat="server" ID="repEmployees">
<ItemTemplate>
<li>
<%# Name(Eval("DepartmentItem") as Item)%>
<%# Name(Eval("EmployeeItem") as Item)%>
</li>
</ItemTemplate>
这是中继器内部的方法“Name()
”的代码
protected string Name(Item item)
{
if (item != null)
{
return item.Name;
}
return string.Empty;
}
输出是:
IT TestUser1
Administration TestUser2
Administration TestUSer3
Administration TestUser4
Administration TestUser5
Finance TestUSer6
是否有可能以某种方式将列表 "empSubRelList" 与部门分组以便我可以获得以下输出:
IT TestUser1
Administration TestUser2 TestUser3 TestUser4 TestUser5
Finance TestUser6
应该这样做:
var list = new List<CustomItem>(){
new CustomItem() { Department= "IT", UserName = "TestUser1"},
new CustomItem() { Department = "Administration", UserName = "TestUser2"},
new CustomItem() { Department = "Administration", UserName = "TestUser3"},
new CustomItem() { Department = "Administration", UserName = "TestUser4"},
new CustomItem() { Department = "Administration", UserName = "TestUser5"},
new CustomItem() { Department = "Finance", UserName = "TestUser6"},
};
list.GroupBy (l => l.Department)
.Select (l => new {
Department = l.Key,
Users = l.Select (x => x.UserName).Aggregate ((c,n) => c + ", " + n )
});
输出:
关键是,您首先要按部门项目分组。之后你 select 用户名 属性 并聚合它们。
Aggregate()
所做的是,它获取当前 (c
) 和下一个 (n
) 项目,然后执行您对它们指定的操作。在这种情况下,它用逗号和空格将它们连接起来 ((c,n) => c + ", " + n)
。然后它会移动到下一个项目
正如Serv所写,您可以在设置转发器的数据源之前进行分组:
IEnumerable<KeyValuePair<string, string>> dataSource = empSubRelList
.GroupBy(listItem => Name(listItem.DepartmentItem))
.Select(grouping => new KeyValuePair<string, string>(
groupping.Key,
string.Join(", ", grouping.Select(emp => Name(emp.EmployeeItem)))
));
repEmployees.DataSource = dataSource;
然后在您的 html 代码中:
<asp:Repeater runat="server" ID="repEmployees">
<ItemTemplate>
<li>
<%# ((KeyValuePair<string, string>)Container.DataItem).Key %>
<%# ((KeyValuePair<string, string>)Container.DataItem).Value %>
</li>
</ItemTemplate>
</asp:Repeater>
抱歉,描述太长了,但我想让用户更容易理解我的问题。
我有一个包含 DepartmentItem
和 EmployeeItem
的列表。
var empSubRelList = new List<EmpDeptRel>();
internal class EmpDeptRel
{
public Item DepartmentItem { get; set; }
public Item EmployeeItem { get; set; }
}
下面是解释我如何向列表中添加项目的代码:
Item userProfile = Sitecore.Context.Database.GetItem("/sitecore/content/Intranet/User Profiles");
foreach (var subRelItem in userProfile.Axes.GetDescendants().Where(p => p.TemplateID.ToString() == Settings.GetSetting("SubRelTemplateID")
&& p["Subsidiary"] == SubssdiaryItem.ID.ToString()).OrderBy(p => p["Department"]))
{
empSubRelList.Add(new EmpDeptRel
{
DepartmentItem = GetItemById(subRelItem["Department"]),
EmployeeItem = subRelItem.Parent.Parent
});
}
我用中继器绑定:
repEmployees.DataSource = empSubRelList;
repEmployees.DataBind();
<asp:Repeater runat="server" ID="repEmployees">
<ItemTemplate>
<li>
<%# Name(Eval("DepartmentItem") as Item)%>
<%# Name(Eval("EmployeeItem") as Item)%>
</li>
</ItemTemplate>
这是中继器内部的方法“Name()
”的代码
protected string Name(Item item)
{
if (item != null)
{
return item.Name;
}
return string.Empty;
}
输出是:
IT TestUser1
Administration TestUser2
Administration TestUSer3
Administration TestUser4
Administration TestUser5
Finance TestUSer6
是否有可能以某种方式将列表 "empSubRelList" 与部门分组以便我可以获得以下输出:
IT TestUser1
Administration TestUser2 TestUser3 TestUser4 TestUser5
Finance TestUser6
应该这样做:
var list = new List<CustomItem>(){
new CustomItem() { Department= "IT", UserName = "TestUser1"},
new CustomItem() { Department = "Administration", UserName = "TestUser2"},
new CustomItem() { Department = "Administration", UserName = "TestUser3"},
new CustomItem() { Department = "Administration", UserName = "TestUser4"},
new CustomItem() { Department = "Administration", UserName = "TestUser5"},
new CustomItem() { Department = "Finance", UserName = "TestUser6"},
};
list.GroupBy (l => l.Department)
.Select (l => new {
Department = l.Key,
Users = l.Select (x => x.UserName).Aggregate ((c,n) => c + ", " + n )
});
输出:
关键是,您首先要按部门项目分组。之后你 select 用户名 属性 并聚合它们。
Aggregate()
所做的是,它获取当前 (c
) 和下一个 (n
) 项目,然后执行您对它们指定的操作。在这种情况下,它用逗号和空格将它们连接起来 ((c,n) => c + ", " + n)
。然后它会移动到下一个项目
正如Serv所写,您可以在设置转发器的数据源之前进行分组:
IEnumerable<KeyValuePair<string, string>> dataSource = empSubRelList
.GroupBy(listItem => Name(listItem.DepartmentItem))
.Select(grouping => new KeyValuePair<string, string>(
groupping.Key,
string.Join(", ", grouping.Select(emp => Name(emp.EmployeeItem)))
));
repEmployees.DataSource = dataSource;
然后在您的 html 代码中:
<asp:Repeater runat="server" ID="repEmployees">
<ItemTemplate>
<li>
<%# ((KeyValuePair<string, string>)Container.DataItem).Key %>
<%# ((KeyValuePair<string, string>)Container.DataItem).Value %>
</li>
</ItemTemplate>
</asp:Repeater>