2013-03-16 78 views
0

我有一個時間表項如下組和聚合與LINQ

ActivityCode:持續時間


  • 項目A:12小時:31mins
  • 項目B:00H:10分鐘
  • 項目A:01h:10mins
  • 項目A:12h:31mins
  • 項目C:12H:31mins
  • 項目B:00H:10分鐘
  • 項目B:01H:10分鐘
  • 項目A:12H:31mins

什麼是正確的方式來組項目總計他們花費的總時間?我試着下面

var summary = from entry in DbSet 
        where entry.Timesheet.UserID == userid && 
        entry.Timesheet.DateSubmitted >= startdate && 
        entry.Timesheet.DateSubmitted <= enddate 
        group entry by entry.ActivityCode.ActivityCode1 
         into groupEntry 
         select new TimeSheetSummary() 
         { 
          ActivityCode = groupEntry.Key, 
          HourSpent = Convert.ToInt32(groupEntry.Sum(x => x.Duration)), 
          Percentage = (Convert.ToInt32(groupEntry.Sum(x => x.Duration))/8) * 100, 
          MinuteSpent = Convert.ToInt32(groupEntry.Sum(x => x.Duration)) * 60, 
         }; 
+0

這不行嗎? – user7116 2013-03-16 01:53:38

+0

還沒有嘗試過,但我想如果這是正確的做法。 – 2013-03-16 01:56:03

+0

試試看,如果它給你一個例外,更新你的問題的細節。 – 2013-03-16 01:57:12

回答

1

如果你想獲得一個百分比,得到一個活動的數量和使用它除以。

不知道你是否需要在這裏用0除法。如果沒有數據,我不確定第二個LINQ會做什麼。不知道這是否會引發錯誤。

Int32 numberOfProjects = (from entry in DbSet 
       where entry.Timesheet.UserID == userid && 
        entry.Timesheet.DateSubmitted >= startdate && 
        entry.Timesheet.DateSubmitted <= enddate 
       select entry.ActivityCode.ActivityCode1).Distinct().Count(); 

var summary = from entry in DbSet 
       where entry.Timesheet.UserID == userid && 
       entry.Timesheet.DateSubmitted >= startdate && 
       entry.Timesheet.DateSubmitted <= enddate 
       group entry by entry.ActivityCode.ActivityCode1 
        into groupEntry 
        select new TimeSheetSummary() 
        { 
         ActivityCode = groupEntry.Key, 
         HourSpent = Convert.ToInt32(groupEntry.Sum(x => x.Duration)), 
         Percentage = (Convert.ToInt32(groupEntry.Sum(x => x.Duration))/numberOfProjects) * 100, 
         MinuteSpent = Convert.ToInt32(groupEntry.Sum(x => x.Duration)) * 60, 
        }; 
+0

如何獲得僅涉及的項目?我的意思是「numberOfProjects」現在考慮表中的所有項目,如果我只想要用戶在特定時間段內執行的項目,考慮到這一考慮,該怎麼辦?Timesheet.UserID TimeSheet.TimeSheetDate – 2013-03-16 02:13:55

+0

哦,呃,忘了過濾日期範圍:) – 2013-03-16 02:23:38

+0

我如何找到LINQ中的ActivityCode對象?我得到「ActivityCode = groupEntry.Key;」不能將類型「int」轉換爲鍵入「xx.xxx.ActivityCode」 – 2013-03-16 04:49:40

0

以下是我在線索中根據其他人的輸入找到的答案。謝謝!

var groupEntries = from entry in DbSet 
         where entry.Timesheet.UserID == userId && 
          entry.Timesheet.TimeSheetDate <= endDate.Date && 
          entry.Timesheet.TimeSheetDate >= startDate.Date 
         group entry by entry.ActivityCode 
          into groupEntry 
          select new 
          { 
           ActivityCode = groupEntry.Key, 
           Duration = Convert.ToInt16(groupEntry.Sum(r => r.Duration)) 
          }; 

    var totalDuration = groupEntries.Sum(r => r.Duration); 

    var result = from groupEntry in groupEntries 
       select new TimeSheetSummary() 
          { 
           ActivityCode = groupEntry.ActivityCode, 
           HourSpent = groupEntry.Duration/60, 
           MinuteSpent = groupEntry.Duration % 60, 
           Percentage = groupEntry.Duration/totalDuration * 100 
          };