在linq中选择总小时数

本文关键字:小时 选择 linq | 更新日期: 2023-09-27 18:07:57

这很难解释,但我会尝试我有一个包含一些字段的表,这个表有一个包含行的子表(我不是在谈论SQL,它是db40,但我使用linq)。得到timefromtimeto的行,示例:

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

在linq中选择总小时数

如果您想要总运行时间,您可以这样做:

 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
         }

如果我没理解错的话,你离得很近。选择后只能进行聚合。

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

假设Rows是某种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)                 
             }

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