1

次のように、フィールドを指定せずに DataTable オブジェクトをクエリしようとしています。

var linqdata = from ItemA in ItemData.AsEnumerable()
select ItemA

しかし、戻り型は

System.Data.EnumerableRowCollection<System.Data.DataRow>

そして、次の戻り値の型が必要です

System.Data.EnumerableRowCollection<<object,object>>

(標準の匿名型と同様)

何か案が?ありがとう

4

2 に答える 2

4

私の理解が正しければ、コードで定義する必要はないが、厳密に型指定された方法で使用できるオブジェクトのコレクションを取得したいと考えています。残念ながら、できません。

匿名は、ある種のバリアントまたは動的オブジェクトのように見えますが、実際には、コンパイル時に定義される厳密に型指定されたクラスです。.NET は、バックグラウンドで自動的に型を定​​義します。.net がこれを実行できるようにするには、型定義を推測するコードから手がかりを得る必要があります。次のようなものが必要です。

from ItemA in ItemData.AsEnumerable()
select ItemA.Item("Name"), ItemA.Item("Email") 

そのため、どのメンバーを定義するかがわかります。それを回避する方法はありません。匿名型を定義するには、情報が論理的に存在する必要があります。

正確にこれを行おうとしている理由に応じて、いくつかのオプションがあります。

  • データ アクセスをカプセル化しながらインテリセンスが必要な場合は、カプセル化されたデータ アクセス クラスからデータ テーブルの代わりに xml を返すことができます。(データ テーブルは非常に簡単に xml に変換できます。XElementのような新しいSystem.Xml.Linqクラスを使用することをお勧めします。これは素晴らしい機能です!) 次に、VS2008 の機能を使用して、xml から xsd スキーマを作成できます。次に、コード ページの上部でそのスキーマを使用/インポートすると、インテリセンスが得られます。
  • データのプロパティを持つオブジェクトが必要であるが、それらのクラス/構造を定義したくない場合は、C#4.0/VB10 で登場する新しい動的オブジェクトが気に入るはずです。SQL が返すものに基づいたオブジェクト プロパティがありますが、インテリセンスはありません。これにはパフォーマンス コストもありますが、(a) 状況によっては問題にならない可能性があり、(b) 状況によっては実際にはそれほど悪くはありません。
  • 多くのクラスを作成することを避けたい場合は、同じコード ファイルでクラス定義の下に構造体/構造体を定義することを検討してください。結果セットにさらに列を追加すると、より多くのパブリック フィールドを持つ構造体を簡単に調整できます。

つまり、(a) 動的、(b) 厳密に型指定されたオブジェクト、(3) インテリセンスの 3のうち任意の 2 つを使用できます。しかし、3つすべてではありません。

于 2009-12-02T18:52:32.637 に答える
0

目的を達成する方法は 1 つありますが、動的 linq の知識が必要です。実行時にクエリを作成し、それを使用します。私は専門家ではなく、実際にそれをいじったことはありませんが、これに関する Scott Guthrie のブログへのリンク - Dynamic Linqがあります。それが役立つことを願っています。

ウェイド

于 2009-12-03T13:13:43.300 に答える