【问题标题】:c# DataTable Linq Group by Multiple column sum int and timespanc# DataTable Linq Group by Multiple column sum int and timespan
【发布时间】:2018-07-18 06:47:33
【问题描述】:

我想将 DataTable Alias 中 Group BY 之后的所有 Volume 和 TotalTimes 列相加为 Temp_DT。记住 Volume & All TotalTimes 列可能有空值或空白值。 谁能帮我通过Linq Method

获取代码

样本 Temp_DT:

结果应该是这种格式

我试过下面的代码,但是 Temp_DT 结果为 Null。

var Temp_DT = tempdt.AsEnumerable().Select(x =>
                    new
                    {
                        UID = x.Field<string>("UID"),
                        EMPNAME = x.Field<string>("Emp Name"),
                        EMPROLE = x.Field<string>("Role"),
                        SUPID = x.Field<string>("Sup ID"),
                        SUPNAME = x.Field<string>("Sup Name"),
                        DESIGNATION = x.Field<string>("Designation"),
                        VOLUME = x.Field<int>("Volume"),
                        LOGINTIME = x.Field<TimeSpan>("Login Time"),
                        BREAKTIME = x.Field<TimeSpan>("Break Time"),
                        HANDLETIME = x.Field<TimeSpan>("Handle Time"),
                        ACTIVETIME = x.Field<TimeSpan>("Active Time"),
                        HOLDTIME = x.Field<TimeSpan>("Hold Time"),
                        ACWTIME = x.Field<TimeSpan>("ACW"),
                        IDLETIME = x.Field<TimeSpan>("Idle"),
                        PRODUCTIVE = x.Field<TimeSpan>("Productive"),
                        NONPRODUCTIVE = x.Field<TimeSpan>("Non Productive"),
                        USERERROR = x.Field<TimeSpan>("User Error Time")
                    }).GroupBy(s => new { s.UID, s.EMPNAME, s.EMPROLE, s.SUPID, s.SUPNAME, s.DESIGNATION })
                    .Select(g => new
                    {
                        g.Key.UID,
                        g.Key.EMPNAME,
                        g.Key.EMPROLE,
                        g.Key.SUPID,
                        g.Key.SUPNAME,
                        g.Key.DESIGNATION,
                        VOLUME = g.Sum(x => Convert.ToInt16(x.VOLUME)),
                        LOGINTIME = new TimeSpan(g.Sum(x => x.LOGINTIME.Ticks)),
                        BREAKTIME = new TimeSpan(g.Sum(x => x.BREAKTIME.Ticks)),
                        HANDLETIME = new TimeSpan(g.Sum(x => x.HANDLETIME.Ticks)),
                        ACTIVETIME = new TimeSpan(g.Sum(x => x.ACTIVETIME.Ticks)),
                        HOLDTIME = new TimeSpan(g.Sum(x => x.HOLDTIME.Ticks)),
                        ACWTIME = new TimeSpan(g.Sum(x => x.ACWTIME.Ticks)),
                        IDLETIME = new TimeSpan(g.Sum(x => x.IDLETIME.Ticks)),
                        PRODUCTIVE = new TimeSpan(g.Sum(x => x.PRODUCTIVE.Ticks)),
                        NONPRODUCTIVE = new TimeSpan(g.Sum(x => x.NONPRODUCTIVE.Ticks)),
                        USERERROR = new TimeSpan(g.Sum(x => x.USERERROR.Ticks)),
                    });

【问题讨论】:

  • 请贴出你目前尝试过的代码
  • 已添加代码,我尝试过但无法完成

标签: c# linq lambda datatable linq-to-entities


【解决方案1】:

您必须使用Ticks 解析TimeSpanSum,如下所示。

var Temp_DT = tempdt.AsEnumerable().Select(x =>
                    new
                    {
                        UID = x["UID"],
                        EMPNAME = x["Emp Name"],
                        EMPROLE = x["Role"],
                        SUPID = x["Sup ID"],
                        SUPNAME = x["Sup Name"],
                        DESIGNATION = x["Designation"],
                        VOLUME = x["Volume"],
                        ERRORTIME = x["Error_Time"],                            
                        ACWTIME = x["ACW"],
                        BREAKTIME = x["Break Time"],
                        IDLETIME = x["Idle"],
                        NONPRODUCTIVE = x["Non Productive"],
                    }).GroupBy(s => new { s.UID, s.EMPNAME, s.EMPROLE, s.SUPID, s.SUPNAME, s.DESIGNATION })
                    .Select(g => {
                      var grouped = g.ToList();
                      return new
                      {
                          UID = g.Key.UID,
                          EMPNAME = g.Key.EMPNAME,
                          EMPROLE = g.Key.EMPROLE,
                          SUPID = g.Key.SUPID,
                          SUPNAME = g.Key.SUPNAME,
                          DESIGNATION = g.Key.DESIGNATION,
                          VOLUME = grouped.Sum(x => Convert.ToInt16(x.VOLUME)),
                          Error_Time = new TimeSpan(grouped.Select(x => ConvertTimeSpan(x.ERRORTIME.ToString())).ToList().Sum(r=> r.Ticks)),
                          ACW = new TimeSpan(grouped.Select(x => ConvertTimeSpan(x.ACWTIME.ToString())).ToList().Sum(r=> r.Ticks)),
                          Break = new TimeSpan(grouped.Select(x => ConvertTimeSpan(x.BREAKTIME.ToString())).ToList().Sum(r=> r.Ticks)),
                          Idle = new TimeSpan(grouped.Select(x => ConvertTimeSpan(x.IDLETIME.ToString())).ToList().Sum(r=> r.Ticks)),
                          NonProductive = new TimeSpan(grouped.Select(x => ConvertTimeSpan(x.NONPRODUCTIVE.ToString())).ToList().Sum(r=> r.Ticks))
                      };
                    }).ToList();

转换方法是,

private static TimeSpan ConvertTimeSpan(string str)
{
   TimeSpan outputValue; 
   TimeSpan.TryParse(str, out outputValue);

   return outputValue;
}

C# Fiddle 带有样本数据。

【讨论】:

  • No Error .. 但是 TimeSpan 并没有添加它只拾取第一个值。
  • @Sarfaraz78615 提供更多输入,因为给定的 Fiddle 示例数据,它按预期工作。
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多