这是一个“让我们看看是否可以完成”的练习。从DataTable的行中创建一个匿名类型的序列
假设我有一个包含多列的DataTable。使用linq,可以选择表的行,使得结果将是一个匿名类型的序列,匿名类型的每个属性根据DataTable的列名命名并设置每个属性的类型适当。
所以,如果我的数据表中有三列,像这样:
Name = "Column1", DataType = string
Name = "Column2", DataType = integer
Name = "Column3", DataType = bool
然后我想选择的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);
}
我知道我可以这样做:
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);
}
但这需要硬编码ne中的属性名称w子句,而我希望属性名称来自DataTable的Columns集合。
我希望我已经解释清楚了。经过一段时间的讨论后,我开始认为,就可读性和可维护性而言,我所提出的任何事情都会是一团糟,但我想我会问。
匿名类型是一种编译时机制,它不会等待直到运行时才描述自己。但是让我们假设你可以解决这个问题,你可以让运行时找出你的属性名称和类型,并围绕它创建一个类型。你打算如何在编译时使用它?真相被告知,如果你处于这种困境中,要么保留'DataTable'或花时间来正确定义类型(匿名或其他)。 – 2011-06-15 20:32:07