按月将值放在数据表组中

时间:2013-04-08 06:21:53

标签: c# linq ado.net group-by

我在c#

中有这个数据表
 Date    Employee Job1   Job2     Job3
1/1/2012    a    1      1          1 
1/1/2012    b    2      2          2
1/1/2012    c    2      1          4
1/1/2012    d    4      2          1
1/2/2012    a    3      2          5
1/2/2012    b    2      2          2
1/2/2012    c    3      3          3
1/2/2012    d    1      1          1
1/3/2012    a    5      5          5
1/3/2012    b    2      2          6
1/3/2012    c    1      1          1
1/3/2012    d    2      3          4
2/1/2012    a    2      2.5        2
2/1/2012    b    5      5          2
2/1/2012    c    2      2          2
2/2/2012    a    3      3          3
2/2/2012    b    2      3          3
3/1/2012    a    4      4          11
3/5/2012    a    14     42.5       15
3/6/2012    a    21     12.143     22
3/8/2012    a    8.9    45         27
3/8/2012    b    4.4    25         31

我希望按月循环遍历值,以便我可以将值存储在数据表中,并使用该值进行其他计算。在这个例子中,它将有三个数据表,首先是1月值,另一个是feb,最后一个是行军行。怎么能由Linq完成。请建议使用Linq语法,该语法将按月分组结果。

var monthEmpGroups = dt.AsEnumerable()
                .Select(r => new
                {                   
                    Year = DateTime.Parse(r.Field<string>("DATE")).Year,
                    Month = DateTime.Parse(r.Field<string>("DATE")).Month.ToString()
                })
                .GroupBy(x => x.Month);

var dtf = CultureInfo.CurrentCulture.DateTimeFormat;
foreach (var empGroup in monthEmpGroups)
{
    int month = int.Parse(empGroup.Key);
    string colName = dtf.GetMonthName(month);
    // Here i want to get all the rows where month is colName (i.e.january, feb, march)
}

请建议是否有其他方法可以使用LINQ获得月份值。

1 个答案:

答案 0 :(得分:4)

您应该将每个群组的项目移到monthEmpGroups查询中:

var monthEmpGroups = (from r in dt.AsEnumerable()
                      let month = DateTime.Parse(r.Field<string>("DATE")).Month
                      group r by month into g
                      select new { Month = g.Key, Items = g.ToList() });

通过它,您可以轻松获得所需的结果:

var dtf = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat;

foreach (var empGroup in monthEmpGroups)
{
    int month = empGroup.Month;
    string colName = dtf.GetMonthName(month);
    List<DataRow> items = empGroup.Items;
}