2012-04-02 2 views
2

можно преобразовать таблицу данных в ienumerable, не зная ее имя класса.Преобразование Datatable в ienumerable <anonymous>?

мое требование преобразовать таблицу

First | Last 
-------------- 
john | mcgill 
clara | linda 

к

{{First:john,Last:mcgill},{First:clara ,Last:linda}} 

IEnumerable коллекция

я не хочу использовать динамический объект, поскольку динамический объект поддерживает только Рамочные 4.

спасибо

+0

Просто просмотрите ваши комментарии. Для чего вам это нужно? Это визуализация (например, сетка)? – Alan

+0

@Alan: да, мне нужно это для сетки – YogeshWaran

+0

В этом случае вы действительно не можете использовать анонимные типы. Если вы используете WPF, не подключаете DataTable к стандартным WPF DataGrid с AutoGenerateColumns = true, что вы хотите? – Alan

ответ

8
var results = from row in dataTable.AsEnumerable() 
       select new { 
        First = row.Field<string>("First"), 
        Last = row.Field<string>("Second") 
       }; 

Вам понадобится System.Data.DataSetExtensions.

+0

Да, я знаю этот способ, но на основе моего требования я не столбца имя во время компиляции. я буду знать только во время работы – YogeshWaran

+0

- это любой другой способ? i head banged with this – YogeshWaran

+0

@YogeshWaran Если вы не знаете имена столбцов во время компиляции, вы не можете получить свой анонимный тип, чтобы его имена полей совпадали с именами столбцов. Именно компилятор генерирует анонимный тип и, следовательно, должен знать имена полей. Одним из подходов было бы использование Reflection Emit для генерации типа во время выполнения; вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/5kyyyeh2.aspx – dlev

1

Вы можете использовать Anonymous Types - они были представлены с .NET 3.5.

Синтаксис для такого рода объектов действительно простой и интуитивно понятный:

var item = new { First = "First-Value", Last = "Last-Value" } 

и запрос:

var items = dataTable.AsEnumerable() 
        .Select(i => new { 
              First = i.Field<string>("First"), 
              Last= i.Field<string>("Last") 
             }); 
+0

Да, я знаю этот способ, но на основе моего требования я не столбца имя во время компиляции. я буду знать имя столбца и выбирать новые свойства объекта только во время выполнения. – YogeshWaran

0

Это довольно простая работа с использованием анонимных типов. Здесь не полный пример, который требует только классы из пространства имен System.Linq и System.Data:

class Program 
    { 
    static void Main(string[] args) 
    { 
     DataTable dataTable = new DataTable(); 
     dataTable.Columns.Add().ColumnName = "First"; 
     dataTable.Columns.Add().ColumnName = "Last"; 
     var row = dataTable.NewRow(); 
     row["First"] = "hello"; 
     row["Last"] = "world"; 
     dataTable.Rows.Add(row); 

     var query = dataTable.Rows.Cast<DataRow>() 
     .Select(r => new 
     { 
      First = r["First"], 
      Last = r["Last"] 
     }); 

     foreach (var item in query) 
     Console.WriteLine("{0} {1}", item.First, item.Last); 
    } 
    } 
1

имен столбцов пожалуйста!

public string ConvertDataTableToString(DataTable table) 
    { 
     int iColumnCount = table.Columns.Count; 
     int iRowCount = table.Rows.Count; 
     int iTempRowCount = 0; 
     string strColumName = table.Columns[0].ColumnName; 
     string strOut = "{"; 
     foreach (DataRow row in table.Rows) 
     { 
      strOut = strOut + "{"; 
      foreach (DataColumn col in table.Columns) 
      { 
       string val = row.Field<string>(col.ColumnName); 
       strOut = strOut + col.ColumnName + ":" + val; 

       if (col.Ordinal != iColumnCount - 1) 
       { 
        strOut = strOut + ","; 
       } 
      } 
      strOut = strOut + "}"; 
      iTempRowCount++; 

      if (iTempRowCount != iRowCount) 
      { 
       strOut = strOut + ","; 
      } 
     } 
     strOut = strOut + "}"; 
     return strOut; 
    } 
+0

Просто добавил это, чтобы проверить, что значение столбца не равно null: string val = row.Field (col.ColumnName); изменено на (используется vb.net) Dim val As String = String.Empty If Not IsDBNull (строка (col.ColumnName)) Тогда val = row (col.ColumnName) –

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