C# 树结构故障显示

C# 树结构故障显示,c#,.net,linq,C#,.net,Linq,我想显示如下树结构: 任务1 活动1 项目1 活动2 任务2 活动3 项目2 但我得到的是一个列表,它重复了每个不同活动或项目的父元素,如下所示: 任务1 活动1 项目1 任务1 活动2 我想将活动和项目分组在一个父元素(“任务”)下 以下是我的LINQ查询: var q = from mission in _context.tMissions join activity in _context.tActivities on m

我想显示如下树结构:

  • 任务1

    • 活动1
      • 项目1
    • 活动2
  • 任务2

    • 活动3
      • 项目2
但我得到的是一个列表,它重复了每个不同活动或项目的父元素,如下所示:

  • 任务1

    • 活动1
      • 项目1
  • 任务1

    • 活动2
我想将活动和项目分组在一个父元素(“任务”)下

以下是我的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 void SetTierTree(IEnumerable 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();
        }
    
    public ICollection GetTierTree()
    {
    var q=来自任务中的_context.t任务
    在_context.tractivities on mission.id等于activity.missionId中加入活动
    在activity.id等于project.activityId的_context.tDefaultEventTypes中加入项目
    其中!project.isRemoved&&project.defaultCategoryId==4
    orderby mission.name
    选择新的DefaultEventType(project.tierLevel.TryParseEnum(GanttType.Unknown),DefaultCategoryRepository.CreateFrom(project.tDefaultCategory))
    {
    //t=新的DefaultEventType(project.tierLevel.TryParseEnum(GanttType.Unknown),DefaultCategoryReportitory.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.Unknown),
    时间戳=project.createdDT,
    UpdatedTimeStamp=project.updatedDT,
    活动=新活动{Id=Activity.Id,Name=Activity.Name,任务=新任务{Id=Mission.Id,Name=Mission.Name}
    };
    var q2=q.GroupBy(row=>row.Activity.Mission.Id)
    .Select(group=>group.GroupBy(row=>row.Activity.Id));
    返回q2.Cast().ToList();
    }
    
    但我在显示页面时收到此错误:
    “无法将类型“System.Collections.Generic.List
    1[System.Linq.IGrouping
    2[System.Int32,DefaultEventType]]”转换为类型“DefaultEventType”。

    首先需要调整查询。在本例中,使用
    GroupBy
    会有很大帮助

    只需准确地获取你所拥有的,然后按任务将结果分组。对于每个组,按活动对任务进行分组(这需要是嵌套的group by,而不是顺序group by)

    我不确定您的提供商是否可以在DB端进行映射;如果没有,则在需要的查询中抛出一个
    AsEnumerable

    接下来,您需要更改呈现数据的方式以反映此更改

    您需要3个嵌套的数据列表,而不是单个的
    数据列表。将整个查询绑定到显示任务的外部级别,然后订阅数据绑定事件,将内部组设置为内部数据列表实例的数据源。然后,在该内部数据列表中,显示活动并将最内层的组级别绑定到最内层的
    数据列表
    ,这可以正常绑定项目名称


    也可以考虑使用<代码> TeeVIEW 来渲染数据结构,而不是<代码> DATALIST/CODE >,因为<代码> TreVIEW 被设计为渲染树。我不确定你是否需要因为某种原因拒绝它,或者只是不考虑它,但它可能会更容易与工作。如果您这样做,查询仍将按照我的建议进行修改,您就不需要任何嵌套的ASP控件。

    q2变量在调试时在结果视图中抛出此错误:{“Method”Project CreateFrom(Project)'不支持转换为SQL。}它也不允许我返回q2.ToList()@negzero7我建议您参考我的帖子中专门讨论的部分:
    “我不确定您的提供商是否可以在DB端进行映射;如果不可以,请在需要的地方在该查询中抛出一个AsEnumerable。”
    where needed几乎可以肯定的是,在你拥有的一切之后,在GroupBys之前。忘了提到我添加了它们:var q2=q.AsEnumerable().GroupBy(row=>row.Activity.Mission.Id)。选择(group=>group.AsEnumerable().GroupBy(row=>row.Activity.Id)).AsEnumerable()@negzero7那么问题在于第一个查询,即使没有我的查询
    CreateFrom
    无法转换为在数据库中,因此您需要将其从
    q
    中删除。如果您只是创建一个对象并分配属性,那么最好只内联该代码,而不是使用方法。如果它做得更多,我不能在不知道它做什么的情况下说你应该做什么。
    var q2 = q.GroupBy(row => row.MissionID)
         .Select(group => group.GroupBy(row => row.ActivityID));