【问题标题】:Feed a LINQ result into a DataROW将 LINQ 结果输入 DataROW
【发布时间】:2011-07-22 10:12:23
【问题描述】:

这行得通:

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 指定列?

【问题讨论】:

  • 什么是actual.Elements?另一个数据表?
  • 元素是一本字典。 “key”部分是一个字符串。 “值”部分是一个具有 4 个属性的类——ValueNumber、ValueString、ValueBinary、ValueDateTime...

标签: c# linq linq-to-objects


【解决方案1】:

您可以编写一个简单的扩展方法,它接受任何IEnumerable&lt;T&gt;,使用反射来获取与T 关联的PropertyDescriptors,并为每个DataColumn 创建一个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;     
}

【讨论】:

    【解决方案2】:

    除了在这里指出您之外,我无法提供太多帮助:

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

    【讨论】:

      【解决方案3】:

      您可能想查看DataTableExtensions.AsEnumerable Method

      我尚未对此进行测试,但这可能会让您指向正确的方向:

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

      【讨论】:

      • 不,它不起作用。它抛出编译错误 DataRow is inaccessible 由于保护级别。如何解决这个问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多