2016-03-04 48 views
-2

我想在数据表中统计项目状态。Linq查询按状态计数

我的DataTable看起来像

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 =“Yes”;

    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); 
         } 
        } 

功能放在这里

静态布尔groupDate(串技能) { bool值= FALSE;

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

      return value; 
    } 
+4

我想要一辆法拉利,新房和sixpack。除非我在其中加入了一些工作,否则我不会得到任何这些结果 - 我建议您尝试解决方案,然后就具体问题寻求帮助。 – Takarii

+0

我已经尝试了解决方案,但我坚持将状态设置为列并根据它计数。我会在这里发布我的linq。并且不要过早地评判别人,这可能是因为人们不希望通过一次性提供大量代码来混淆别人。 – Rehan

+0

这不是判断。你在问题中说我想要xyz。 SO不是代码写作服务,所以如果你不提供任何东西,你什么也得不到。看到[问一个好问题](http://stackoverflow.com/help/how-to-ask) – Takarii

回答

2

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

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 
+0

非常感谢Keith。我会尝试一下代码并让你知道。虽然我有一个问题,我真的不知道什么数据可以进入状态栏。这将是动态的。而且,我的Datatable基本上来自具有日期和状态列的Sharepoint列表数据。 – Rehan

+0

@MdRehanMoazzam这个答案可能会帮助你动态列:http://stackoverflow.com/a/26719396/4473405 –