2013-01-09 64 views
0

我正在提取數據表中員工的出勤詳細信息。 它看起來像這樣Linq查詢查找數據表中的最小值和最大值

Day  SwipeTime 
12/31/2012 11AM 
12/31/2012 1PM 
12/31/2012 7PM 
12/31/2012 8PM 
1/1/2012 2PM 
1/1/2012 7PM 
1/1/2012 8PM 
1/2/2012 10AM 
1/2/2012 8PM 

我需要顯示的日期和totalhours爲僱員 其中totalhours = lastswipe - firstwipe

我的結果會是什麼樣子

Day TotalHours 
12/31/2012 9 
1/1/2012 6 
1/2/2012 12 

,所以我需要查找按日期分組的最小和最大滑動次數。 請幫我填寫查詢

+0

SwipeTime集合是一個字符串? –

+0

是的,它是一個字符串.. – sajad

+1

沒有字段叫swipetype至於它是否刷卡或刷卡? – naveen

回答

3

你可以用Enumerable.GroupBy來組織date。然後,你可以創建一個Dictionary<DateTime,int>其中關鍵是日期和值是總時間爲日期:

Dictionary<DateTime,int> dateGroups = table.AsEnumerable() 
    .GroupBy(r => r.Field<DateTime>("Date").Date) 
    .Select(g => new{ 
     Date = g.Key, 
     TotalHours = g.Sum(r => 
       DateTime.ParseExact(r.Field<string>("SwipeTime"), 
         "htt", CultureInfo.InvariantCulture).Hour) 
    }).ToDictionary(x => x.Date, x => x.TotalHours); 

編輯:所以,這是一整天的TotalHours,現在所需的最大-min計算。您也已將您所需的時間段格式更改爲「上午11:41」。然後我會用DateTime.Parse(str).TimeOfDay來獲得時間。

Dictionary<DateTime, int> dateGroups = table.AsEnumerable() 
.GroupBy(r => r.Field<DateTime>("Date").Date) 
.Select(g => new 
{ 
    Date = g.Key, 
    TotalHours = 
     (g.Max(r => DateTime.Parse(r.Field<string>("SwipeTime")).TimeOfDay) 
     - g.Min(r => DateTime.Parse(r.Field<string>("SwipeTime")).TimeOfDay)).Hours 
}).ToDictionary(x => x.Date, x => x.TotalHours); 
+0

我得到這個錯誤:字符串不被識別爲有效的DateTime。顯然我的滑動格式就像11:41 PM ....在這種情況下應該是什麼字符串格式? – sajad

+0

@sajad:編輯我的答案,以考慮您的最大 - 最小值要求和您的新日期/時間跨度格式。 –

+1

從我+1解析提示:) –

2

在這種應答有序的次列表創建天,以避免兩件事情 - 解析所有行兩次,並從解析值創建兩套獲得最大和最小的項目。此外,我不分組的前一天解析,因爲相同的日期將具有相同的字符串值。

var query = from row in table.AsEnumerable() 
      group row by row.Field<string>("Day") into g 
      let times = g.Select(r => DateTime.Parse(r.Field<string>("SwipeTime"))) 
         .OrderBy(t => t.TimeOfDay) 
         .ToList() 
      select new 
      { 
       DateTime.Parse(g.Key).Date, 
       (times.Last() - times.First()).TotalHours 
      }; 

結果是匿名的對象具有兩個屬性DateTime Datedouble TotalHours

+1

你不需要'DateTime.ParseExact',你可以簡單地使用'DateTime.Parse(「11:41 AM 「)'。 –

+0

@TimSchmelter謝謝,蒂姆,我會試試:) –