【问题标题】:Linq query to get count by status [closed]Linq查询按状态获取计数[关闭]
【发布时间】:2016-03-04 11:32:13
【问题描述】:

我想统计数据表中的项目状态。

我的数据表看起来像

Date , Tkt Status
1/2/13    open
1/2/13    open
2/2/13    open
2/2/13    closed
2/2/13    closed
3/3/13    in-progress
4/3/13    closed 

我想要另一个数据表,格式如下

Date, Open, Closed, in-progress
1/2/13   2        0            0
2/2/13   1        2            0
3/3/13   0        0            1
4/3/13   0        1            0

我希望使用 Linq 来完成。

到目前为止我的尝试

dataQuery.Query = "是";

                    dataQuery.ViewFields = "<FieldRef Name='Created' /><FieldRef Name='tckPrty' /><FieldRef Name='tckStat' />";
                    dataQuery.ViewFieldsOnly = true;
                    tktData = tktList.GetItems(dataQuery).GetDataTable();

                    var newData = from row in tktData.AsEnumerable()
                                  where groupDate(row.Field<string>("tckStat"))
                                          group row by row.Field<string>("Created") into Status
                                          orderby Status.Key
                                          select new
                                          {
                                              key = Status.Key,
                                              values = Status,
                                              count = Status.Count()
                                          };

                    foreach (var item in newData)
                    {
                        foreach (string s in tktStatus)
                        {
                            chartData.Rows.Add(item.key,item.count);
                        }
                    }

函数在这里

static bool groupDate(字符串技能) { 布尔值 = 假;

            if (skill== "open")
            {
                value = true;
            }
            else
            {
                value = false;
            }

            return value;
    }

【问题讨论】:

  • 我想要一辆法拉利、一栋新房子和一辆六包。除非我投入一些工作,否则我不会得到任何这些 - 我建议您尝试解决方案,然后就具体问题寻求帮助。
  • 我已经尝试了解决方案,但我坚持将状态设置为列并在其下获取计数。我将在这里发布我的 linq。并且不要过早地判断人,可能是不想通过一次给出大量代码来混淆他人。
  • 这不是判断。你在我想要xyz的问题中说。 SO 不是代码编写服务,因此如果您什么都不提供,您将一无所获。见Asking a good question
  • 如果您知道解决方案,请提供其他答案。不要让它看起来很脏。

标签: c# linq


【解决方案1】:

显然我们没有您的数据表可以使用,所以我根据您的示例构建了一个数组。

var lines = @"Date , Tkt Status
1/2/13    open
1/2/13    open
2/2/13    open
2/2/13    closed
2/2/13    closed
3/3/13    in-progress
4/3/13    closed".Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Skip(1).Select(l => l.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)).Select(x => new { Date = x[0], Status = x[1] }).ToArray();

然后,您可以像这样使用 LINQ 对其进行分组:

var grouped = lines.GroupBy(l => l.Date).Select(g => new {
    Date = g.Key,
    Open = g.Count(l => l.Status == "open"),
    Closed = g.Count(l => l.Status == "closed"),
    InProgress = g.Count(l => l.Status == "in-progress")
}).ToArray();

输出:

Date    Open Closed InProgress
1/2/13  2    0      0
2/2/13  1    2      0
3/3/13  0    0      1
4/3/13  0    1      0

【讨论】:

  • 非常感谢基思。我会尝试代码并让你知道。虽然我有一个问题,我真的不知道状态列中可以包含哪些数据。它将是动态的。而且我的数据表基本上来自具有日期和状态列的 Sharepoint 列表数据。
  • @MdRehanMoazzam 这个答案可能会帮助您处理动态列:stackoverflow.com/a/26719396/4473405
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2013-04-21
相关资源
最近更新 更多