【问题标题】:Convert datatable to list with relation将数据表转换为具有关系的列表
【发布时间】:2014-10-06 13:06:11
【问题描述】:

我有一张桌子(一张桌子)这只是一个例子 - 实时表非常大。

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 通过这个对象得到什么,如果可以的话,不是 Queryable 级别(但没关系)。
让我们从获取LINQ 开始:

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

谢谢X。

【问题讨论】:

  • 你的班级不应该是Employee 并且Devision 中的属性应该是List&lt;Employee&gt; Employees 吗?或者您不想将员工分组到同一个部门对象下?
  • 是的,你是对的 - 改变了
  • 你甚至没有提到你想要的结果。

标签: c# linq datatable ienumerable


【解决方案1】:

这应该是你想要的:

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 不进行任何转换,您必须提供正确的类型或将值转换为目标类型(或更改表格的填充方式)。


现在您已经完全改变了问题,您似乎实际上想按DevisionId 和EmployeeId 进行分组,并为每个组初始化一个List&lt;Employees&gt;。那就看看吧:

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();

现在Employees 中的属性Info 也是List&lt;Info&gt;,这应该适合您:

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();

【讨论】:

  • OP 更改了部门以获取员工列表。
  • Employees(int id, Info info) 有一些错误,但我需要public Employees(int id, List&lt;Info&gt; info) - 很抱歉,如果您能以正确的方式进行更改。比X
  • 最后一个列表应该是List&lt;date, hours&gt; - 请现在更正它选择List&lt;empid, new(date, hours)&gt;
  • @Hurricane:你失去了我。没有List&lt;date, hours&gt;。一个通用列表只能有一种类型。
  • @TimSchmelter 抱歉,我在最后一条评论中写错了,列表选择像 List&lt;empid, List&lt;date, hours&gt;&gt; 但只有 - List&lt;date, hours&gt; 只有一个元素
猜你喜欢
  • 2018-01-09
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2021-11-17
相关资源
最近更新 更多