2015-07-21 50 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