0

おそらく重複ですが、投稿する前にここでグーグルと検索を試みました。

列を持つ2列のテーブルを想定します

Age (整数) および EmpName (文字列)

データテーブルは、単純な dbTable.AsEnumerable() によって IEnumerable に変換できます。

AsEnumerable が列挙可能な一連のデータ行を返したという事実により、intellisense がそれを取得しないため、Linq を実行するには、列名を知っている必要があります。私は小さな 2 列のテーブルを使用しましたが、多くの列を持つテーブルの場合は面倒です。そのため、ほとんどの場合、次のようなことを試みます

var results = from p in dbTable.AsEnumerable()
            select new
            {
               name = p.Field<string>("name"),
               age = p.Field<int>("age")
            };

最後に、結果を入力して を押します。(ドット) インテリセンスはドロップダウンに名前と年齢を表示します。質問: リフレクションを使用して列名と列の種類を照会するにはどうすればよいですか?

var results = YourMagicRoutine(dbTable);
//You can use lambda etc instead of method call in above line

結果が IntelliSense になり、正しい列名が表示されるようになりました

ありがとうございました

4

2 に答える 2

1

できません。インテリセンスを取得するには、コンパイル時に列に関する情報を知る必要があります。実行時に、データテーブルの列を調べてプロパティを作成する魔法のオブジェクトを作成できますが、そのオブジェクトにはインテリセンスがありません。

コメントで述べたように、データテーブルではなく、そのタイプに固有のクラスにデータを保存する場合、この問題は発生しません。そうでない場合は、各行を手動で他のタイプ(匿名かどうかに関係なく)に変換して、インテリセンスを取得する必要があります。

于 2012-04-24T17:09:34.573 に答える
1

実行時に型を構築するためにリフレクションを使用できます。ただし、インテリセンスが実際に発生するデザインタイムでは役に立ちません。


ただし、O/R マッパーの魔法を使用することはできます。O/R マッパーは、データベース テーブルをクラスにマップします。DataSet、Table、Row、および TableAdapter を操作する代わりに、ドメイン オブジェクトを操作します。O/R-mapper を使用すると、次のように動作します

List<Person> people = dbContext.Query<Person>()
    .Where(p => p.Name.StartsWith("A"))
    .OrderBy(p => p.Age)
    .ToList();

O/R マッパーはたくさんいます。したがって、ここでは特定のものについて言及しません。

于 2012-04-24T17:11:57.640 に答える