2015-07-21 40 views
0

对不起,我想简化让用户理解我的问题。 我有一个包含DepartmentItemEmployeeItem的列表。按对象列表中的项目(Sitecore项目)分组,并与Repeater绑定

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 
+0

我认为这可以帮助你http://stackoverflow.com/questions/20637654/ho w-to-retrieve-common-items-from-list-c-sharp – Nikolay

回答

1

由于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> 
1

这应该这样做:

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) 
    }); 

输出:

enter image description here

他们关键的是,你第一次按你的部门项目分组。之后,您选择用户名属性并将其聚合。 Aggregate()所做的是,它需要当前(c)和下一个(n)项目,然后执行您指定的项目。在这种情况下,连接它们用逗号和空格((c,n) => c + ", " + n)然后移动到下一个项目

Demo Code

+0

非常感谢你的回答,但我无法汇总'UserName'。在你的例子中它是一个'string'。但在我的情况下,它是一个'Sitecore项目'。 – Kamran

+0

你可以解析它到一个字符串?或者,这个SiteCoreItem有任何可以从中选择的属性,你可以聚合?我并不熟悉SiteCore,但我很肯定,你可以按照上述方法处理你的问题 – Marco