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
- 活动1
- 任务2
- 活动3
- 项目2
- 活动3
- 任务1
- 活动1
- 项目1
- 活动1
- 任务1
- 活动2
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));