Преобразование вертикального DataTable в модель C# - PullRequest
0 голосов
/ 07 августа 2020

У меня есть значения в Datatable по вертикали, как это

введите описание изображения здесь

Мне нужно преобразовать это в список таких объектов

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
    }
}

Но я не могу думать о logi c по размеру

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Модель:

class Employee
{
    public int Id { get; set; }
    public decimal Salary { get; set; }
    public int Age { get; set; }
    public string Department { get; set; }
}

Данные:

var dataTable = new DataTable();
dataTable.Columns.Add("Primary Key", typeof(int));
dataTable.Columns.Add("Column Name", typeof(string));
dataTable.Columns.Add("Value", typeof(string));

dataTable.Rows.Add(221, "Salary", "10000");
dataTable.Rows.Add(221, "Department", "Support");
dataTable.Rows.Add(221, "Age", "31");
dataTable.Rows.Add(222, "Salary", "1000");
dataTable.Rows.Add(222, "Age", "22");

Код 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();
0 голосов
/ 07 августа 2020

Вы можете сделать это с этим объектом List или сделать это анонимно.

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