2013-09-18 2 views
2

У меня есть таблица данных с последующей записьюКак преобразовать запись данных в пользовательский класс?

Columns -> A B C D E 
Rows->  1 2 3 X Y 
      1 2 3 P Q 

Я хотел бы это DataTable, чтобы преобразовать в мой пользовательского список следующим образом

MyClass 
{ 
int A 
int B 
int C 
List<ChildClass> 
} 

ChildClass 
{ 
String D 
String E 
} 

Я использую следующий код, чтобы сделать это, но я застрял между для ChildClass. Пожалуйста помоги?

IList<MyClass> items = dt.AsEnumerable().Select(row => 
    new MyClass 
     { 
      A= row.Field<int>("A"), 
      B= row.Field<int>("B"), 
      C= row.Field<int>("C"), 
     }).ToList(); 
+0

Я не совсем следую логике. Зачем вам нужен D & E в дочернем классе? Если вам это нужно, зачем вам список? – Jonesopolis

+0

В моем реальном приложении MyClass - это моя пользовательская категория производительности, а дочерний класс связан с CustomCounters. Поэтому, поскольку одна категория может иметь несколько счетчиков, поэтому мне нужен список дочерних классов. Точно так же будет несколько категорий. A, B, C feilds являются уникальными факторами для принятия решения о новом MyClass, это означает, что если A, B, C имеют одинаковое значение в datatable соответствующих D, E coulumn valus должны появиться с другим дочерним списком. Надеюсь, теперь я понятен? –

+0

Я думаю, что ваша база данных неправильно нормализована. Вы должны рассмотреть возможность разбиения групп A, B, C на собственную таблицу. (посмотрите «нормализация базы данных», если вы не уверены, что я имею в виду) –

ответ

0

Вы должны использовать GroupBy. Что-то вроде следующего.

IList<MyClass> items = dt.AsEnumerable().GroupBy(
    row => 
     new 
     { 
      A = row.Field<int>("A"), 
      B = row.Field<int>("B"), 
      C = row.Field<int>("C"), 
     }, 
    (key, values) => 
     new MyClass 
     { 
      A = key.A, 
      B = key.B, 
      C = key.C, 
      Children = values.Select(row => 
       new ChildClass 
       { 
        D = row.Field<string>("D"), 
        E = row.Field<string>("E"), 
       }).ToList() 
     }).ToList(); 

В вашем примере, это приведет к одному MyClass объекта (значения свойств 1, 2, 3) с двумя ChildClass объектов внутри него (значения свойств X, Y и P, Q соответственно).

0
xyz.Select(row=> new Class1 
       { 
        A = row.Field<int>("A"), 
        B = row.Field<int>("B"), 
        C = row.Field<int>("C"), 
        list = xyz.Select(row1=> new ChildClass 
       { 
        D = row1.Field<int>("D"), 
        E = row1.Field<int>("E") 
       }).ToList() 
       }); 

Предположим, у вас есть список данных xyz. Попробуйте это, это сработает.

Смежные вопросы