从DataTable中的行创建一系列匿名类型

Chr*_*way 5 c# linq anonymous-types system.data.datatable

这是一个"让我们看看它是否可以完成"运动比什么都重要.

假设我有一个包含多个列的DataTable.使用linq,是否可以选择表的行,使得结果将是匿名类型的序列,其中匿名类型的每个属性根据DataTable的列名命名,并且每个属性的类型都设置为适当.

所以,如果我的DataTable有三列如下:

Name = "Column1",  DataType = string
Name = "Column2",  DataType = integer
Name = "Column3",  DataType = bool
Run Code Online (Sandbox Code Playgroud)

然后我想选择DataTable的所有行,使匿名类型有三个属性:

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);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

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);
}
Run Code Online (Sandbox Code Playgroud)

但这需要对新子句中的属性名称进行硬编码,而我希望属性名称来自DataTable的Columns集合.

我希望我已经清楚地解释了这一点.在玩了一下之后,我开始认为,就可读性和可维护性而言,我提出的任何事情都会是一团糟,但我想我会问.

Bra*_*etz 4

恐怕没有这样的魔力(至少对于匿名类型来说没有)。匿名类型是编译器作为不可变类生成的隐式类型,其属性由显式赋值操作命名和类型化,如第二个示例(在编译时)所示。

您想要做的事情需要在运行时构造一个动态类型。