2011-03-17 9 views
0

私はエンティティフレームワーク4.0を使用しています。私は実行時にLINQクエリを使用して自分のデータベース内のテーブルからDataTableを作成しようとしています。コードは次のとおりです。オブジェクトタイプLINQからデータテーブルを作成する

var result = from r in DbContext.People.AsEnumerable() 
     select new { r.PersonID, r.FirstName, r.LastName }; 

結果変数にデータがあります。

IEnumerable<DataRow> drs = result as IEnumerable<DataRow>; // This line returns null 

私はdrs変数にdatarowsを取得しません。上記の操作を実行した後、どのようにデータテーブルのLoadDataRow()メソッドを使用してデータテーブルを作成できますか?

ここで間違っていることを教えてください。これにより、事前

+1

Googleはあなたの友人です:http://www.c-sharpcorner.com/UploadFile/VIMAL.LAKHERA/LINQResultsetToDatatable06242008042629AM/LINQResultsetToDatatable.aspx – codymanix

+0

+1の良いコメント –

答えて

2

ありがとう:

select new { r.PersonID, r.FirstName, r.LastName }; 

あなたは匿名型を作っています。これはDataRowではないため、変換が失敗します。

新しいDataTableを作成し、foreachループなどでその結果をresultに格納する必要があります。これを直接DataRowにキャストすることはできません。

1

resultは、DataRowsの列挙型ではありません。どんな場合でも明示的にDataRowにキャストしない匿名型の列挙型になります。匿名型をDataRowに変換するには、最初に列名を使用してDataTableを作成し、次に匿名型のインスタンスごとに新しいDataRowをDataTableに追加する必要があります。新しいDataRowを明示的にインスタンス化することはできません。 DataRowオブジェクトの構造は、親のDataTableに完全に依存します。

1

まず、DbContextはデータベースとのEF4のコンテキストであると仮定します。次に、まず最初に、AsEnumerable()メソッドを呼び出す必要はありません。単純にPeopleテーブルをクエリします。

第2に、DataRowではなく、匿名タイプを返しています。 EF4クエリーから戻ると、変数rを返すことができます。これは、プログラムでさらに使用できるPeopleクラスのインスタンスになります。 DataRowが必要な場合は手動で作成する必要がありますが、可能であればEF4で作成されたオブジェクトを使用することをおすすめします。

この後も、データベースのクエリ中に遅延実行が発生することに注意してください。つまり、foreachループで使用する前にクエリが実行されないか、First,SingleまたはToList()などのメソッドを呼び出します。結果がすぐに必要な場合は、クエリの最後にToList()を追加してください。

関連する問題