C# 将垂直数据表转换为C模型

C# 将垂直数据表转换为C模型,c#,datatable,C#,Datatable,我在Datatable中有一个垂直的值,如下所示 var listOfEmployees = new List<Employee>(); listOfEmployees.Add(new Employee{ Id=221, Salary=10000, Age=31 }); listOfEmployees.Add(new Employee{ Id=222, Age=31 }); 我需要把它转换成这样的对象列表 var listOfEmployees = new Lis

我在Datatable中有一个垂直的值,如下所示

var listOfEmployees = new List<Employee>();

listOfEmployees.Add(new Employee{
    Id=221, Salary=10000, Age=31
});
listOfEmployees.Add(new Employee{
    Id=222, Age=31
});
我需要把它转换成这样的对象列表

var listOfEmployees = new List<Employee>();

listOfEmployees.Add(new Employee{
    Id=221, Salary=10000, Age=31
});
listOfEmployees.Add(new Employee{
    Id=222, Age=31
});
我所做的

DataTable dTable = new DataTable();

for (int i = 0; i < dTable.Columns.Count; i++)
{
    for (int j = 0; j < dTable.Rows.Count; j++)
    {
       var value = dTable.Rows[j][i];
       // for Primary Key Check if exist in list
       // Match Column Name
       // Fill Value
    }
}

但是我想不出适合它的逻辑

你可以使用这个列表对象,也可以匿名使用

var listOfEmployees = new List<Employee>();
listOfEmployees = (from DataRow dr in dt.Rows
                   select new Employee()
                   {
                      Id = dr["PrimaryKey"],
                      Salary = dr["Salary"].ToString(),
                      Age = dr["Age"].ToString(),
                   }).ToList();
型号:

数据:

LINQ代码:

var employees = dataTable.AsEnumerable()
    .GroupBy(
        row => row.Field<int>("Primary Key"),
        row => new { ColumnName = row.Field<string>("Column Name"), Value = row["Value"] }
    )
    .Select(g => new Employee
    {
        Id = g.Key,
        Salary = Convert.ToDecimal(g.FirstOrDefault(x => x.ColumnName == "Salary")?.Value),
        Age = Convert.ToInt32(g.FirstOrDefault(x => x.ColumnName == "Age")?.Value),
        Department = g.FirstOrDefault(x => x.ColumnName == "Department")?.Value.ToString()
    })
    .ToList();

在列名中,我们需要找到列,它的实际值将在值中。我相信这完全回答了您的问题。在列名中,我们将得到不同的属性,即薪资部门age@VishalPandey啊,更新了答案,实现这一点的简单方法。这些东西和其他语法有点混淆。表中没有薪水和年龄列。这是错误的答案。
var employees = dataTable.AsEnumerable()
    .GroupBy(
        row => row.Field<int>("Primary Key"),
        row => new { ColumnName = row.Field<string>("Column Name"), Value = row["Value"] }
    )
    .Select(g => new Employee
    {
        Id = g.Key,
        Salary = Convert.ToDecimal(g.FirstOrDefault(x => x.ColumnName == "Salary")?.Value),
        Age = Convert.ToInt32(g.FirstOrDefault(x => x.ColumnName == "Age")?.Value),
        Department = g.FirstOrDefault(x => x.ColumnName == "Department")?.Value.ToString()
    })
    .ToList();