2017-08-04 153 views
1

我有2列DataTable:Id(长),日期(DataTime)。 如何组此获得分组列表中的LINQ:如何按年份和月份分组?

2017.08.03 
     345675 
     877685 
2017.08.04 
     988798 
     898967 
     675675 

接下来,我必须给每个组发送到存储过程作为一个参数。 我可以在数据表有大约300000行,所以linq扩展应该很快。

好的。现在,我想为每个组织做些事情。我该怎么做?

var GroupedbyDates = dataTable.AsEnumerable().GroupBy(x => ((DateTime)x["Date"]).Date); 

for (var i = 0; i < threadCount; i++) 
{ 
       Task task = Task.Factory.StartNew(DoSomething); 
       tasks.Add(task); 
} 

private DoSomething() 
{ 
    while (true) 
    { 
     var item = ?? //one of groups; 

     if (item != null) 
     { 
      var result = DoSomething2(); 
      HandleResult(result); 
     }    
    } 
} 

如何迭代IGrouped?

UPDATE

我有这样的事情:

var r = dataTable.AsEnumerable() 
    .GroupBy(x => ((DateTime)x["Date"]).Year) 
    .ToDictionary(year => year.Key, g => g.GroupBy(x => 
     ((DateTime)x["Date"]).Month)         
    .ToDictionary(month => month.Key, d => d 
    .Select(t => new { Root_Id = t["Id"] }))); 

到:

2017.08.03 
     345675 
     877685 
2017.08.04 
     988798 
     898967 
     675675 
+3

任何去除一部分时间和项目组获得团体的例子努力从你身边实现这一目标? –

回答

-1

这个怎么解决呢? 不要忘记使用AsParallel()来使这个LINQ在大数据上更加有效。

// dt - your DataTable with DataRows, where dataRow[0] - is int id, and dataRow[1] - is DateTime. 
dt.Rows.AsParallel() 
       .ConvertAll(dr => new 
       { 
        id = int.Parse((dr as DataRow)[0].ToString()), 
        dateTime = new TimeSpan(DateTime.Parse((dr as DataRow)[1].ToString()).Ticks), 
       }) 
       .GroupBy(objIdDate => objIdDate.dateTime.TotalDays); 
0

基于对这个问题的日期

2017.08.03 
    345675 
    877685 
2017.08.04 
    988798 
    898967 
    675675 

可以使用DateTime.Date财产纯日期

var groups = datatable.AsEnumerable().GroupBy(item => item.Date.Date);