CopyToDataTable方法

时间:2013-06-05 19:55:00

标签: c# linq

我一直在MSDN上查看以下教程,但似乎无法将该方法应用于我的代码 - 无法弄清楚它们之间的区别是什么!

这篇文章位于Creating a DataTable From a Query (LINQ to DataSet),特别是代码 -

// Create a sequence. 
Item[] items = new Item[] { 
  new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"}, 
  new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
  new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Mary Barnes"},
  new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Black"}
};

// Query for items with price greater than 9.99.
var query = from i in items
             where i.Price > 9.99
             orderby i.Price
             select i;

// Load the query results into new DataTable.
DataTable table = query.CopyToDataTable();

看起来很简单。具有书籍和电影子类的对象数组似乎可以转换为DataRow,这就是CopyToDataTable的运行方式。

但是我存储在var中的对象数组不允许我使用CopyToDataTable方法。我原以为我的对象'qryData'与上面的'items'非常相似....

var qryData =
    sdTable.AsEnumerable().Cast<DataRow>()
           .OrderByDescending(t => t[c.ColumnName] == DBNull.Value
                                    ? 0 : Convert.ToSingle(t[c.ColumnName]))
           .GroupBy(t => t["DAT_ID"])
           .Select(g => new {g, count = g.Count()})
           .SelectMany(x => x.g.Select(b => b)
                                .Zip(Enumerable.Range(1, x.count), (j, i) => new {
                                   inst = j["DAT_ID"],
                                   idn = j["ID_NUM"],
                                   val = j[c.ColumnName],
                                   tdt = dailyCount[Convert.ToInt32(j["DAT_ID"])],
                                   rn = i
                                 })
             );

查询工作正常,带回'(inst,idn,val,tdt,rn)'的大集合,但不能使用CopyToDataTable。 {方法不可用}添加.ToArray()或.AsEnumerable()也无济于事。

感谢您的帮助!

编辑:

快速记录, 我已经包含System.Data,认为.CopyToDataTable()方法可用。我试图包含System.Data.DataTableExtensions - 但不是。然后我尝试在我的项目中包含System.Data.DataSetExtensions作为(.NET)引用 - 但没有帮助。

1 个答案:

答案 0 :(得分:0)

基于此声明:

  

但不能使用CopyToDataTable。添加.ToArray()或.AsEnumerable()也无济于事。

您只需在代码文件的顶部添加相应的using语句即可使用namespace中定义的扩展方法。因此,请查看您定义的namespace该类,并将using添加到您要在其中使用的代码文件的顶部。