在linq中选择总小时数
本文关键字:小时 选择 linq | 更新日期: 2023-09-27 18:07:57
这很难解释,但我会尝试我有一个包含一些字段的表,这个表有一个包含行的子表(我不是在谈论SQL,它是db40,但我使用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))))
}
如果您想要总运行时间,您可以这样做:
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)};