我有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 ??
更新
我有这样的事情:
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
答案 0 :(得分:8)
var grouped = table.AsEnumerable().GroupBy(x = > new { x.Date.Year, x.Date.Month });
答案 1 :(得分:0)
根据问题中的示例,按日期
获取群组Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub chkNotKnown_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkNotKnown.CheckedChanged
With txtDrCode
If chkNotKnown.Checked Then
.Text = "Not Known"
.Enabled = False
Else
.Text = ""
.Enabled = True
End If
End With
End Sub
End Class
您可以使用2017.08.03
345675
877685
2017.08.04
988798
898967
675675
属性按纯日期删除时间部分和组项
DateTime.Date
答案 2 :(得分:-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);