データテーブルで行から一連の匿名タイプを作成する
-
28-10-2019 - |
質問
これは、何よりも「それができるかどうかを見てみましょう」運動です。
いくつかの列のあるデータテーブルがあるとします。 LINQを使用すると、結果が匿名タイプの各プロパティがデータテーブルの列名と各プロパティのタイプが設定されている匿名タイプのシーケンスになるように、テーブルの行を選択することは可能ですか?適切に。
したがって、私のデータテーブルには次のような3つの列がある場合:
Name = "Column1", DataType = string
Name = "Column2", DataType = integer
Name = "Column3", DataType = bool
次に、匿名タイプに3つのプロパティがあるように、データテーブルのすべての行を選択したいと思います。
DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r => **** MAGIC HERE ****)
foreach (var s in seq)
{
Console.WriteLine(s.Column1);
Console.WriteLine(s.Column2);
Console.WriteLine(s.Column3);
}
私はこれができることを知っています:
DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r =>
new
{
Column1 = r.Field<string>("Column1"),
Column2 = r.Field<int>("Column2"),
Column3 = r.Field<bool>("Column3"),
}
)
foreach (var s in seq)
{
Console.WriteLine(s.Column1);
Console.WriteLine(s.Column2);
Console.WriteLine(s.Column3);
}
ただし、これには新しい句のプロパティ名をハードコーディングする必要がありますが、プロパティ名はデータテーブルの列コレクションから来てほしいと思います。
これを十分に明確に説明したことを願っています。これを少し遊んだ後、私は読みやすさと保守性に関する限り、私が思いついたものはすべて大きな混乱になると考え始めていますが、私は尋ねると思いました。
解決
私はそのような魔法がないのではないかと心配しています(少なくとも匿名タイプではそうではありません)。匿名タイプは、2番目の例(コンパイル時間)のように、明示的な割り当て操作によって名前が付けられ、入力されたプロパティを備えた不変のクラスとしてコンパイラによって生成される暗黙のタイプです。
あなたがやりたいことは、実行時に構築される動的なタイプが必要です。
他のヒント
ブランドンの回答ですでに確立されているように、これはコンパイル時に生成されるため、匿名タイプでは実行できません。ただし、前述のように、ダイナミクスを利用して同様の構文を取得できます。
たとえば、次の構文を取得できます(例に基づいて):
var seq = table.AsEnumerable().Select(row => (dynamic)new DynamicDataRow(row));
foreach (var s in seq)
{
Console.WriteLine(s.Column1);
Console.WriteLine(s.Column2);
Console.WriteLine(s.Column3);
}
データロウにシンプルな動的ラッパーを使用してください:
class DynamicDataRow : DynamicObject
{
private readonly DataRow row;
public DynamicDataRow(DataRow row)
{
this.row = row;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
DataColumn column = row.Table.Columns[binder.Name];
if (column != null)
{
result = row[column];
return true;
}
result = null;
return false;
}
}
私はあなたのユースケースが何であるか正確にはわかりませんが、ダイナミクスが匿名のタイプの許容可能な代替品であると判断した場合、これが正しい方向を指すのに役立つことを願っています。