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();
十分に単純に思えます。本と映画のサブクラスを持つオブジェクト配列は、CopyToDataTable が実行する DataRow に変換できるようです。
しかし、var に格納するオブジェクト配列では、CopyToDataTable メソッドを使用できません。私のオブジェクト「qryData」は上記の「アイテム」に非常に似ていると思いました....
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() を追加しても役に立ちません。
ご協力いただきありがとうございます!
編集:
簡単に言うと、.CopyToDataTable() メソッドが使用可能であると考えて、System.Data を含めました。System.Data.DataTableExtensions を含めようとしましたが、そこにはありません。次に、System.Data.DataSetExtensions を (.NET) 参照としてプロジェクトに含めようとしましたが、役に立ちませんでした。