将datatable转换为具有关系的列表

时间:2014-10-06 13:06:12

标签: c# linq datatable ienumerable

我有一张桌子(一张桌子)这只是一个例子 - 实时表如此巨大。

DevisionId  EmployeeId  date        Hour    
1130107     3011657     2014-10-11  8   
1130107     3011657     2014-10-12  1   
1130107     3011660     2014-10-11  8   
1130107     3011660     2014-10-12  6   

我希望将此数据表转换为对象列表列表,请告诉我如何执行此操作的最佳方法。

就像这样的例子

public class Devision 
{
    public int ID {get;set;}
    public List<Employees> Employee {get;set;}
    Devision(int id, List<Employees> emp)
    {
        ID = id;
        Employees = emp;
    }
}

public class Employees 
{
    public int ID {get;set;}
    public List<Info> Item {get;set;}
    Employees(int id, List<Info> info)
    {
        ID = id;
        Item = info;
    }
}

public class Info 
{
    public DateTime Date {get;set;}
    public float Hour {get;set;}
    Info(DateTime dtime, float hour)
    {
        Date = dtime;
        Hour = hour;
    }
}

LINQ可以通过这个对象得到什么,如果你不能查询级别(但是没关系)。
让我们从获得LINQ之类开始:

var mytab = Table.AsEnumerable();
        var itemses =
            mytab.Select(

ThankX。

1 个答案:

答案 0 :(得分:3)

这应该是你想要的:

List<Devision> devisions = Table.AsEnumerable()
    .Select(row => new Devision(
        row.Field<int>("DevisionId"),
        new Employees(
            row.Field<int>("EmployeeId"), 
            new Info(row.Field<DateTime>("date"), row.Field<float>("Hour")))))
    .ToList();

请注意,您的构造函数必须为public。此外,DataRow.Field不进行任何转换,您必须提供正确的类型或将值转换为目标类型(或更改表的填充方式)。


现在您已完全更改了问题,您似乎确实希望按DevisionIdEmployeeId进行分组,并为每个组初始化List<Employees>。然后看看:

List<Devision> devisions = Table.AsEnumerable()
    .GroupBy(row => new {
        EmpID = row.Field<int>("EmployeeId"),
        DevID = row.Field<int>("DevisionId")})
    .Select(devEmpGroup => new Devision(
        devEmpGroup.Key.DevID, devEmpGroup 
        .Select(row => new Employees(
            devEmpGroup.Key.EmpID,
            new Info(row.Field<DateTime>("date"), row.Field<float>("Hour"))))
        .ToList()))
    .ToList();

既然Info中的Employees属性也是List<Info>,那么这应该适合您:

List<Devision> devisions = Table.AsEnumerable()
    .GroupBy(row => row.Field<int>("DevisionId"))
    .Select(devGrp => new Devision(
        devGrp.Key,
        devGrp.GroupBy(row => row.Field<int>("EmployeeId"))
               .Select(g => new Employees(
                   g.Key,
                   g.Select(r => new Info(r.Field<DateTime>("date"), r.Field<float>("Hour")))
                    .ToList()))
              .ToList()))
    .ToList();