2010-11-27 132 views
0

我想創建一個「簡單」的時間表應用程序,幾乎正在做我需要做的事情,我不確定這是做這件事的最有效的方式,所以請給我反饋,如果你有更好的想法.. 。我在SO之前在這裏得到了幫助(請參閱Group items with Linq and display in table in MVC view,您還可以在其中看到數據庫模式)。現在我只需要能夠在更多的嵌套級別進行分組。與Linq的嵌套分組?

我現在得到的是一種表佈局看有點像這樣:

項目任務1 2 3(以小時日期在細胞)

ProjA分析8 8 8

ProjB分析8 7 8

(ETC)

這裏是在視圖模型,我用它來填充表(一個或多個)屬性:

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一樣。但linq組表達式和所有已經讓我感到困惑的事情,所以我不知道如何做到這一點。我在這裏有點頭痛,我認爲時間表應用程序不會是一件很難的事情(至少是基本的)。但是,如果我能夠完成這個任務分組的工作,我就可以做得相當接近,所以我不會重複它。

有關如何更改我的代碼來做到這一點的任何意見,將不勝感激! (如果你認爲我做錯了,請告訴我如何)

回答

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

+0

謝謝,但我不能得到它的工作。編譯器抱怨代碼中的所有東西......我不明白i.Date.Substring(8)中的「i」)來自哪裏。此外,ts2.Hours中的小時數等編譯器無法識別... – Anders 2010-11-27 12:39:16