C#:Groupby,数据集

时间:2016-04-01 07:15:54

标签: c# asp.net linq group-by dataset

以下是我从数据库中获取的数据集:

Id -- Date -- ClockIn -- ClockOut

1  --  1/1/2016 -- 1/1/2016:09:00:00 -- 1/1/2016:17:03:00

1  --  1/2/2016 -- 1/1/2016:09:00:00 -- 1/1/2016:11:30:00   

1  --  1/2/2016 -- 1/1/2016:13:00:00 -- 1/1/2016:15:03:00

预期结果

1 -- 1/1/2016(8 hrs) -- 09:00:00 -- 17:03:00 
1 -- 1/2/2016(4 hrs) -- 09:00:00 -- 11:30:00
                     -- 13:00:00 -- 15:03:00  

问题:我想要一个分组日期字段和clockIn / out的差异及其当天的总和

以下是我正在尝试但无法使其正常工作的代码:

var resultSet = from newSet in Dtinfo.AsEnumerable()
    group newSet by new
    {
        uid = newSet.Field<int>("UID"),
        gDate = newSet.Field<DateTime>("wDate"),
        inTime = newSet.Field<DateTime>("punchIn"),
        outTime = newSet.Field<DateTime>("punchOut"),

        location = newSet.Field<String>("locName"),
        typeName = newSet.Field<String>("typeName"),

    } into counter
    select new
    {
        UID = counter.Key.uid,
        wDate=counter.Key.gDate,
        punchIn = counter.Key.inTime,
        punchOut = counter.Key.outTime,
        locName= counter.Key.location,
        typeName= counter.Key.typeName,
        diff = (counter.Key.outTime - counter.Key.InTime).TotalHours,

    };

我得到了不同之处,但我需要小组,并且总结也可以工作。

路径上的任何灯光都会有所帮助。

1 个答案:

答案 0 :(得分:1)

这是查询。 我正在使用

返回匿名课程
  • Date - 按
  • 分组的日期
  • TotalHours - 当天所有参赛作品的总和
  • Entries - 条目,另一个匿名类

用命名类替换它们可能更好。

var res = from newset in Dtinfo.AsEnumerable()
              group newset by newset.Field<DateTime>("wDate")
                  into counter
                  select new
                  {
                      Date = counter.Key,
                      TotalHours = counter.Select(a => a.Field<DateTime>("punchOut") - a.Field<DateTime>("punchIn")).Sum(a => a.TotalHours),
                      Entries = counter.Select(a => new
                      {
                          uid = a.Field<int>("UID"),
                          gDate = a.Field<DateTime>("wDate"),
                          /*other fields here
                           * 
                           * 
                           */
                      })
                  };