2017-08-04 175 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);