выберите сумму часов в linq - PullRequest
       31

выберите сумму часов в linq

2 голосов
/ 07 сентября 2011

Это будет сложно объяснить, но я постараюсь, у меня есть таблица с некоторыми полями, и эта таблица получила подтаблицу со строками (я не говорю о SQL, его DB4O, но я использую linq).Строки получили timefrom и timeto, пример:

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))))
                 }

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Если вы хотите общее прошедшее время, вы можете сделать:

 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 голос
/ 07 сентября 2011

Если предположить, что строки - это что-то вроде 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)                 
             }
1 голос
/ 07 сентября 2011

Если я вас правильно понимаю, вы довольно близко. После выбора может быть выполнена только агрегация.

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 голосов
/ 07 сентября 2011

(c.TimeTo - c.TimeFrom) имеет тип TimeSpan:

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