与Linq嵌套分组?

时间:2010-11-27 00:44:44

标签: asp.net linq asp.net-mvc-2

我正在尝试创建一个“简单”的时间表应用程序几乎正在做我需要它做的事情,我不确定这是最有效的方法,所以如果你有更好的想法,请给我反馈。 ..我之前在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组的表达式和所有这些已经让我如此困惑,所以我不知道如何完成这项工作。我在这里有点过头了,我认为时间表应用程序不会那么难(至少是一个基本的)。但是,如果我可以让这个任务分组工作,我就相当接近可以做的事情,所以我不会重复它。

如何更改我的代码以执行此操作的任何建议将不胜感激! (如果你认为我做错了,请告诉我怎么做)

1 个答案:

答案 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),因为你不想使用引用相等...