2012-12-03 70 views
0

我想顯示一個樹形結構是這樣的:故障顯示樹狀結構

  • Mission1

    • 活性1
      • PROJECT1
    • 活性2
  • Mission2

    • Activity3
      • Project2的

但相反我收到重複的每個活動或項目,是不同的父元素就像一個列表這個:

  • Mission1

    • 活性1
      • PROJECT1
  • Mission1

    • 活性2

我想將一個家長('Mission')元素下的Activities和Projects分組。

這裏是我的LINQ查詢:

var q = from mission in _context.tMissions 
       join activity in _context.tActivities on mission.id equals activity.missionId 
       join project in _context.tDefaultEventTypes on activity.id equals project.activityId 
       where !project.isRemoved && project.defaultCategoryId == 4 
       orderby mission.name 
       select CreateFrom(project); 

     return q.ToList(); 

我然後只綁定,爲一個列表,並在頁面上顯示。這裏是我的aspx:

<asp:DataList ID="dlTierTypes" runat="server"> 
     <ItemTemplate> 
     <li><%# Eval("Activity.Mission.Name") %></li> 
      <ul> 
      <li><%# Eval("Activity.Name") %></li> 
      <ul> 
       <li><%# Eval("Name") %></li> 
      </ul> 
     </ItemTemplate> 
    </asp:DataList> 

而且後面的代碼只是將其綁定:

public void SetTierTree(IEnumerable<DefaultEventType> tierList) 
    { 
     dlTierTypes.DataSource = tierList; 
     dlTierTypes.DataBind(); 
    } 

不知道如何準確地解決這個。

編輯 - 這是我在庫中的新功能。

public ICollection<DefaultEventType> GetTierTree() 
    { 
     var q = from mission in _context.tMissions 
       join activity in _context.tActivities on mission.id equals activity.missionId 
       join project in _context.tDefaultEventTypes on activity.id equals project.activityId 
       where !project.isRemoved && project.defaultCategoryId == 4 
       orderby mission.name 
       select new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory)) 
       { 
        //t = new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory)), 
        AllowNumericSuffix = project.allowNumericSuffix, 
        AttachMilestoneMoniker = project.attachMilestoneMoniker, 
        Description = project.description, 
        Id = project.id, 
        IsReadOnly = project.isReadOnly, 
        IsSticky = project.isSticky, 
        Name = project.name, 
        Sid = project.sid, 
        Style = project.style.TryParseEnum<GanttElementStyle>(GanttElementStyle.Unknown), 
        TimeStamp = project.createdDT, 
        UpdatedTimeStamp = project.updatedDT, 
        Activity = new Activity { Id = activity.id, Name = activity.name, Mission = new Mission { Id = mission.id, Name = mission.name } } 
       }; 

     var q2 = q.GroupBy(row => row.Activity.Mission.Id) 
      .Select(group => group.GroupBy(row => row.Activity.Id)); 

     return q2.Cast<DefaultEventType>().ToList(); 
    } 

但顯示的頁面時,我收到此錯誤: '無法從類型轉換'System.Collections.Generic.List 1[System.Linq.IGrouping 2 System.Int32,DefaultEventType]爲鍵入 'DefaultEventType'。'

回答

1

首先你需要調整查詢。在這個例子中使用GroupBy可以幫助很大

只要採取你所擁有的,然後按任務分組結果。對於每個小組,按活動對任務進行分組(這需要嵌套分組,而不是連續分組)。

var q2 = q.GroupBy(row => row.MissionID) 
    .Select(group => group.GroupBy(row => row.ActivityID)); 

我不確定您的提供者是否可以在數據庫端執行該映射;如果不在需要的地方拋出AsEnumerable

接下來,您需要更改呈現數據的方式以反映此更改。

而不是一個DataList你需要3個嵌套的數據列表。您將整個查詢綁定到顯示任務的外層,然後訂閱數據綁定事件以將內層組設置爲內層數據列表實例的數據源。然後,在該內部數據列表中,顯示活動並將最內層組綁定到最裏面的DataList,這可以正常綁定項目名稱。

此外,您可以考慮使用TreeView來呈現數據結構而不是DataList,因爲TreeView被設計用於呈現樹。我不確定是否由於某種原因需要拒絕它,或者只是沒有考慮它,但它可能會更容易處理。如果你走這條路線,查詢仍然會按照我的建議進行修改,那麼你就不需要任何嵌套的ASP控件。

+0

在調試時,q2變量在結果視圖中引發此錯誤:{「Method'Project CreateFrom(Project)'不支持對SQL的轉換。」}它也不讓我返回q2.ToList()。 – Omni

+0

@ negzero7我將你引用到我的帖子中專門討論的部分:''我不確定你的提供者是否可以在數據庫端執行該映射;如果不是在需要時在該查詢中引用一個AsEnumerable。 「需要的地方」幾乎可以肯定就是你們之前的所有事情以及集體旁邊的事情。 – Servy

+0

忘了提及我添加了它們:var q2 = q.AsEnumerable()。GroupBy(row => row.Activity.Mission.Id) .Select(group => group.AsEnumerable()。GroupBy(row => row。 Activity.Id))AsEnumerable(); – Omni