Преобразование Datatable в ienumerable <anonymous>? - PullRequest
2 голосов
/ 02 апреля 2012

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

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

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

до

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

Неисчислимая коллекция

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

спасибо

Ответы [ 4 ]

8 голосов
/ 02 апреля 2012
var results = from row in dataTable.AsEnumerable()
              select new {
                  First = row.Field<string>("First"),
                  Last = row.Field<string>("Second")
              };

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

1 голос
/ 05 декабря 2012

Пожалуйста, не указывайте имена столбцов!

    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;
    }
1 голос
/ 02 апреля 2012

Вы можете использовать Анонимные типы - они были введены в .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 голосов
/ 02 апреля 2012

Это довольно простая работа с использованием анонимных типов.Вот полный пример, который требует только классов из пространств имен 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);
    }
  }
...