2011-09-07 73 views
2

這將是很難解釋,但我會嘗試 我有一個表的一些字段,並且該表獲得行的子表(我不是在談論SQL,它的DB4O,但我使用linq)。行了timefromtimeto,例如:在linq中選擇總時間

maintable: 
Description, 
CreateDate, 
.... 
mainTableRows: 
08:00, 
09:00, 
some description 

現在我需要做一個查詢,將總結小時從行,像這樣:

09:00-08:00 = 1hour(first row) + 10:00-09:00 (second row) 

等。

喜歡的東西:

var item = from mainTable m 
      select new 
      { 
       m.Id, 
       Hours = m.Rows.Sum(c=> new { Hour = c.TimeTo - c.TimeFrom }) 
      } 

感謝所有幫助,這是我的完整的解決方案:

var item = from mainTable m 
       select new 
       { 
        m.Id, 
        Hours = String.Format("{0:HH:mm}", (new DateTime((p.TimesheetRows.Aggregate(TimeSpan.Zero, (subtotal, t) => subtotal += (t.TimeTo - t.TimeFrom)).Ticks)))) 
       } 
+1

全只?或者你想要幾分鐘的時間?也是行'DataTable',或某種'IEnumerable '? –

+0

這裏真正的問題是什麼?你提供了一個示例查詢,但是你沒有說它失敗的地方? –

+0

好...有一個問題,我問如何實現我的問題這個查詢只是一個例子,因爲它不像這樣工作 – Cfaniak

回答

4

如果你想總的運行時間,你可以這樣做:

var item = from mainTable m 
     select new 
     { 
      m.Id, 
      Hours = m.Rows 
        .Select(c => c.TimeTo - c.TimeFrom) 
        .Aggregate((working, next) => working.Add(next)) 
        .TotalHours 
     } 
+1

+1最好的解決方案,因爲你可以在整整幾個小時後,沒有中間四捨五入錯誤,或者按照原樣進行詳細的時間跨度。 –

+0

@Philip:這是我的想法 - 但它不完全清楚OP想要什麼... –

+0

該示例缺少lambda:'.Aggregate((working,next)=> working.Add(next))' –

1

如果我理解你正確地你是相當接近。選擇後只能進行聚合。

private class TestData 
{ 
    public DateTime from; 
    public DateTime to; 
} 

public static test() 
{ 
    Collection<TestData> x = new Collection<TestData>(); 
    x.Select(item => (item.to - item.from).Hours).Sum(); 
} 
0

(c.TimeTo - c.TimeFrom)類型爲時間跨度的:

var item = from m in mainTable 
      select new { m.Id, Hours = m.Rows.Sum(c => (c.TimeTo - c.TimeFrom).TotalHours)}; 
1

假設行是某種IEnumerable<T>,你可以做這個如果你想分數小時:

var item = from mainTable m 
      select new 
      { 
       m.Id, 
       Hours = m.Row.Sum(c => (c.TimeTo - c.TimeFrom).TotalHours) 
      } 

或者這樣,如果你想的全數個小時的總和:

var item = from mainTable m 
      select new 
      { 
       m.Id, 
       Hours = m.Row.Sum(c => (c.TimeTo - c.TimeFrom).Hours)     
      }