Подать результат LINQ в DataROW - PullRequest
3 голосов
/ 22 июля 2011

Это работает:

var Result = from e in actual.Elements
                         select new
                         {
                             Key = e.Key,
                             ValueNumber = e.Value.ValueNumber,
                             ValueString = e.Value.ValueString,
                             ValueBinary = e.Value.ValueBinary,
                             ValueDateTime = e.Value.ValueDateTime
                         };

Но это не работает:

IEnumerable<DataRow> Result = from e in actual.Elements
                select new DataRow
                {
                    Key = e.Key,
                    ValueNumber = e.Value.ValueNumber,
                    ValueString = e.Value.ValueString,
                    ValueBinary = e.Value.ValueBinary,
                    ValueDateTime = e.Value.ValueDateTime
                };

DataTable dt = Result.CopyToDataTable(Result);

Можете ли вы исправить это для меня? Я хочу, чтобы второй бит кода работал, чтобы я мог поместить его в DataTable. Я понимаю, что синтаксис совершенно неверен в # 2. Как вы определяете столбец, используя LINQ, как это?

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Вы можете написать простой метод расширения, который принимает любое IEnumerable<T>, использует отражение для получения PropertyDescriptor s, связанных с T, и создает DataColumn для каждого

public static DataTable PropertiesToDataTable(this IEnumerable<T> source)
{
      DataTable dt = new DataTable();

      var props = TypeDescriptor.GetProperties(typeof(T));

      foreach (PropertyDescriptor prop in props)
      {
          DataColumn dc = dt.Columns.Add(prop.Name,prop.PropertyType);
          dc.Caption = prop.DisplayName;
          dc.ReadOnly = prop.IsReadOnly;
      }

      foreach (T item in source)
      {
            DataRow dr = dt.Rows.NewRow();
            foreach (PropertyDescriptor prop in props)
                dr[prop.Name] = prop.GetValue(item);

            dt.Rows.Add(dr);
      }

      return dt;     
}
1 голос
/ 22 июля 2011

Я не могу предложить большую помощь, кроме как указать вам здесь:

http://blogs.msdn.com/b/aconrad/archive/2007/09/07/science-project.aspx

0 голосов
/ 22 июля 2011

Возможно, вы захотите взглянуть на DataTableExtensions.AsEnumerable Метод

Я не проверял это, но это может указывать на правильное направление:

IEnumerable<DataRow> result = (from e in actual.Elements
                              select new DataRow
                              {
                                  Key = e.Key,
                                  ValueNumber = e.Value.ValueNumber,
                                  ValueString = e.Value.ValueString,
                                  ValueBinary = e.Value.ValueBinary,
                                  ValueDateTime = e.Value.ValueDateTime
                              }).AsEnumerable();

DataTable dt = Result.CopyToDataTable(Result);
...