2009-10-20 208 views
8

次のコード例は、MSDN hereから借りています。私はquery.CopyToDataTable()を私のコードで利用可能にしていません。 (私の次のコードのコメント行を見てください)。Linq Query()の.CopyToDataTable()が表示されない理由

public static bool SetPhysicianAsNotonServer(DataTable dt) 
     { 
      DataTable dtPhysicianServer = dt; 
      DataTable dtPhysicianClient = GetPhysicianClient(); 

      var query = 
       from SPhysician in dtPhysicianServer.AsEnumerable() 
       join CPhysician in dtPhysicianClient.AsEnumerable() 
       on SPhysician.Field<string>("PhysicianNumber") equals 
        CPhysician.Field<string>("PhysicianNumber") 
       select new 
       { 
        PhysicianNumber = CPhysician.Field<string>("PhysicianNumber") 
       }; 

      DataTable FilterDt = query; //query.CopyToDataTable(); 
      //YET TO DO CODE HERE 
      return true; 
     } 
+0

を拡張するタイプIEnumerable<T>でなければなりません

public static DataTable CopyToDataTable<T>( this IEnumerable<T> source ) where T : DataRow 

CopyToDataTable<T>

var query = from SPhysician in dtPhysicianServer.AsEnumerable() join CPhysician in dtPhysicianClient.AsEnumerable() on SPhysician.Field<string>("PhysicianNumber") equals CPhysician.Field<string>("PhysicianNumber") select CPhysician; DataTable FilterDt = query.CopyToDataTable(); 

定義: これを試してみてくださいどのようなエラーメッセージが表示されますか? –

答えて

20

selectステートメントは、DataRowのシーケンスではなく、一連の文字列(IEnumerable<string>またはIQueryable<string>)を返しています。 CopyToDataTable()は、IEnumerable<T>でのみ使用できます.Tは、DataRowから派生したものです。

代わりのselect new { ... } - ちょうど、あなたにそのタイプの新しいシーケンスを取得しようとします:

select CPhysician; 

CPhysician行の所望の配列を返すべき。

編集 あなたがデータテーブルに非DataTableの由来Tを変換したい場合は、MSDNは、任意のタイプを反映して変換を実行するサンプル・クラスがあります。

http://msdn.microsoft.com/en-us/library/bb669096.aspx

+0

なぜDVですか? –

+1

+1(データセットエクステンションを参照する必要があるかもしれませんが、問題は解決しません)。 –

+0

いいですね。しかし、どうやってこれを解決するのか教えてください。このIEnumerable query = //上記のコード全体を実行すると、JoinをLinq Queryに入れることができません。 – Jango

5

あなたはそれをインポートしていますか?

System.Data.DataTableExtensions.CopyToDataTable() 

はまた、あなたがSystem.Data.DataSetExtensionsアセンブリを参照してSystem.Data名前空間を使用する必要が

System.Data.DataSetExtensions 
+1

これが含まれていないと、DataTable.AsEnumerableも失敗します。 –

+1

これは正しい答えです – Abra001

2

この参照の追加を確認します。

+0

これは参考になる問題ではありません。 DataSetExtensionsアセンブリは既にそこにあります。 – Jango

0

あなたはSystem.Data.DataSetExtensionsアセンブリを参照することがありますか?この拡張メソッドはそこで定義されています。 MSDNオンラインにさらにナビゲート

0

このページに私をもたらします:http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

それは(System.Dataを使用して)System.Data名前空間に言うと、あなたはSystem.Data.DataSetExtensions.dllを参照する必要があります。

+0

これが問題だった場合、AsEnumerableへの呼び出しは失敗しますか? –

+0

私はあなたが正しいと思います。私は少ししか研究をしなかったし、テストするVSもなかった...そして、私は@Rex Mがおそらくこの質問に対する正しい答えを持っていることを理解している:-) –

3

私はそれがFieldオブジェクトを保持する匿名型を作成しているためだと思います。 `)あなたは` CopyToDataTable(呼び出ししようとした場合それでは、クエリを選択すると、TDataRow

+0

はうまくいきませんでした。同じこと...私は見ることができません.CopyToDataTable() – Jango

+0

他の人が言及したように、DataSetExtensionsを参照しようとしましたか? –