using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var records = new List<Record>
{
new Record { Id = 1, StartDate = new DateTime(2013, 1, 1, 10, 20, 0), EndDate = new DateTime(2013, 1, 1, 10, 25, 0)},
new Record { Id = 1, StartDate = new DateTime(2013, 1, 1, 10, 40, 0), EndDate = new DateTime(2013, 1, 1, 11, 15, 0)},
new Record { Id = 2, StartDate = new DateTime(2013, 1, 2, 10, 20, 0), EndDate = new DateTime(2013, 1, 2, 10, 25, 0)},
new Record { Id = 1, StartDate = new DateTime(2013, 1, 2, 11, 20, 0), EndDate = new DateTime(2013, 1, 2, 12, 22, 0)},
};
var query = from r in records
group r by new { r.Id, r.StartDate.Date } into g
select new
{
g.Key.Id,
g.Key.Date,
TotalDuration = g.Sum(x => (x.EndDate - x.StartDate).TotalMinutes)
};
foreach(var item in query)
Console.WriteLine("{0} {1} {2} min", item.Id, item.Date.ToShortDateString(), item.TotalDuration);
}
}
public class Record
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int Chapter { get; set; }
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgoKY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgCiAgICAgICAgdmFyIHJlY29yZHMgPSBuZXcgTGlzdDxSZWNvcmQ+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5ldyBSZWNvcmQgeyBJZCA9IDEsIFN0YXJ0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxLCAxMCwgMjAsIDApLCBFbmREYXRlID0gbmV3IERhdGVUaW1lKDIwMTMsIDEsIDEsIDEwLCAyNSwgMCl9LAogICAgICAgICAgICAgICAgbmV3IFJlY29yZCB7IElkID0gMSwgU3RhcnREYXRlID0gbmV3IERhdGVUaW1lKDIwMTMsIDEsIDEsIDEwLCA0MCwgMCksIEVuZERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMSwgMTEsIDE1LCAwKX0sCiAgICAgICAgICAgICAgICBuZXcgUmVjb3JkIHsgSWQgPSAyLCBTdGFydERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMiwgMTAsIDIwLCAwKSwgRW5kRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAyLCAxMCwgMjUsIDApfSwKICAgICAgICAgICAgICAgIG5ldyBSZWNvcmQgeyBJZCA9IDEsIFN0YXJ0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAyLCAxMSwgMjAsIDApLCBFbmREYXRlID0gbmV3IERhdGVUaW1lKDIwMTMsIDEsIDIsIDEyLCAyMiwgMCl9LAogICAgICAgICAgICB9OwoKCiAgICAgICAgdmFyIHF1ZXJ5ID0gZnJvbSByIGluIHJlY29yZHMKICAgICAgICAgICAgICAgICAgICBncm91cCByIGJ5IG5ldyB7IHIuSWQsIHIuU3RhcnREYXRlLkRhdGUgfSBpbnRvIGcKICAgICAgICAgICAgICAgICAgICBzZWxlY3QgbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBnLktleS5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgZy5LZXkuRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxEdXJhdGlvbiA9IGcuU3VtKHggPT4gKHguRW5kRGF0ZSAtIHguU3RhcnREYXRlKS5Ub3RhbE1pbnV0ZXMpCiAgICAgICAgICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBmb3JlYWNoKHZhciBpdGVtIGluIHF1ZXJ5KQogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswfSB7MX0gezJ9IG1pbiIsIGl0ZW0uSWQsIGl0ZW0uRGF0ZS5Ub1Nob3J0RGF0ZVN0cmluZygpLCBpdGVtLlRvdGFsRHVyYXRpb24pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgY2xhc3MgUmVjb3JkCiAgICB7CiAgICAgICAgcHVibGljIGludCBJZCB7IGdldDsgc2V0OyB9CiAgICAgICAgcHVibGljIERhdGVUaW1lIFN0YXJ0RGF0ZSB7IGdldDsgc2V0OyB9CiAgICAgICAgcHVibGljIERhdGVUaW1lIEVuZERhdGUgeyBnZXQ7IHNldDsgfQogICAgICAgIHB1YmxpYyBpbnQgQ2hhcHRlciB7IGdldDsgc2V0OyB9CiAgICB9