public static void Main()
return new FindPayrollSummariesResponse
Summaries = from p in payrollSummaries
orderby p.MemberFirstName
group p by new { p.MemberFirstName, p.MemberLastName, p.MemberPayrollId, p.MemberId, p.MemberLocationName } into g
let timeSum = TimeSpan.FromMinutes(g.Where(r => r.Time > 0).Sum(r => r.Time))
select new FindPayrollSummariesResponse.PayrollSummary
FirstName = g.Key.MemberFirstName,
LastName = g.Key.MemberLastName,
PayrollId = g.Key.MemberPayrollId,
Location = g.Key.MemberLocationName,
MemberId = g.Key.MemberId,
SubTotal = (int)timeSum.TotalHours + " hours, " + timeSum.Minutes + " minutes",
where r.Amount > 0 || r.Time > 0
let rowSum = TimeSpan.FromMinutes(r.Time)
select new FindPayrollSummariesResponse.PayrollRow
Category = r.ExpenseCategory,
Time = (int)rowSum.TotalHours + " hours, " + rowSum.Minutes + " minutes",
TimeInHours = Math.Round(rowSum.TotalHours, 2),
ProgramId = r.TenantProgramId,
ProgramAbbreviation = r.ProgramAbbreviation,
PayrollCategory = r.PayrollCategory.Humanize()