我正在尝试创建一个“简单”的时间表应用程序几乎正在做我需要它做的事情,我不确定这是最有效的方法,所以如果你有更好的想法,请给我反馈。 ..我之前在SO获得了帮助(参见Group items with Linq and display in table in MVC view,您还可以在其中查看数据库架构)。现在我只需要能够在一个嵌套级别进行分组。
我现在得到的是一种看起来像这样的表布局:
项目任务1 2 3(单元格中的小时数日期)
ProjA分析8 8 8
ProjB分析8 7 8
(ETC)
这是我用来填充表格的viewmodel中的属性:
public IEnumerable<IGrouping<Project, TimeSegment>> TimeSegmentsByProject
{
get
{
var projectGroups = from timeSegment in ts.TimeSegments
group timeSegment by timeSegment.Project
into projectGroup
select projectGroup;
return projectGroups.ToList();
}
}
以下是视图中的代码:
<table>
<tr>
<th>
Projekt
</th>
<th>
Aktivitet
</th>
<th>
Timmar
</th>
</tr>
<% foreach (var item in Model.TimeSegmentsByProject)
{ %>
<tr>
<td>
<%:item.Key.Name %>
</td>
<td>
<table>
<% foreach (var i in item)
{ %>
<tr>
<td>
<%: i.Task.Name %>
</td>
</tr>
<% } %>
</table>
</td>
<td>
<table>
<% foreach (var i in item)
{ %>
<tr>
<% for (int index = 0; index < 30; index++)
{%>
<td width="20px">
<%if (i.Date.Substring(8) == index.ToString())
{ %>
<%: i.Hours %>
<% } %>
</td>
<% } %>
</tr>
<% } %>
</table>
</td>
</tr>
<% } %>
</table>
现在,问题是这样可以正常工作,但即使Project被分组并且每个项目只出现一次,任务也会以相同任务名称的新行重复。我只希望每个任务一次,就像Project一样。但linq组的表达式和所有这些已经让我如此困惑,所以我不知道如何完成这项工作。我在这里有点过头了,我认为时间表应用程序不会那么难(至少是一个基本的)。但是,如果我可以让这个任务分组工作,我就相当接近可以做的事情,所以我不会重复它。
如何更改我的代码以执行此操作的任何建议将不胜感激! (如果你认为我做错了,请告诉我怎么做)
答案 0 :(得分:0)
这是一个刺痛。
var projectGroups =
from timeSegment in ts.TimeSegments
group timeSegment by new //start off by grouping two properties
{
ProjectName = timeSegment.Project.Name,
TaskName = timeSegment.Task.Name
} into g
select new
{
Key = g.Key,
Values = //and finish off by turning each group into another query.
(
from ts in g
group ts by ts.Date.Substring(8)) into g2
select new {
indexValue = g2.Key,
Hours = g2.Sum(ts2 => ts2.Hours)
}
).ToList()
};
现在,仅仅因为我在这里使用了匿名类型,并不意味着你需要。您可以声明实际的类并使用它们进行投影。只是要小心用作分组键的类(它有ProjectName和TaskName),因为你不想使用引用相等...