Linq使用动态变量名选择new
本文关键字:选择 new 变量名 动态 Linq | 更新日期: 2023-09-27 18:27:06
我想为Linq Collection制作一个通用的数据表我是一个乞丐,所以如果不可能的话,请告诉我
public void Something(DataTable dt)
{
var data = from row in dt.AsEnumerable()
select new {
Order = row["Order"].ToString(),
Something = row["Something"].ToString(),
Customer = row["Customer"].ToString(),
Address = row["Address"].ToString()
};
}
这是一张桌子的代码我想要这样的东西:
public static void convertDatatable(DataTable dt)
{
var results = from myRow in dt.AsEnumerable()
select new
{
foreach(DataColumn column in dt.Columns)
column.ColumnName // linq Variable name
= myRow[column.ColumnName];// linq Variable Value
};
}
我知道我怎么写是行不通的,但还有别的办法吗?
注意:我这样做的原因是因为我不能将Datatable直接转换为JSON——它将其序列化为XMl,然后将其作为包含该XMl的字符串发送。
如果你想继续使用数据表,那么在另一个SO中提到了这一点:在ASP.NET 2.0中,我应该使用什么将数据表序列化为JSON?,哪个链接指向我应该使用什么在ASP.NET 2.0中将DataTable序列化为JSON?。
然而,我强烈建议您考虑放弃DataTables和DataRows,代之以ORM,如Entity Framework(此处为EF Quick Start)或Linq to Sql-还有其他方法,但由于您是初学者,这些方法提供了最简单的学习曲线;尤其是因为Visual Studio中提供了完全的设计器支持。
对于.Net提供的JSON序列化的标准形式(例如WCFsDataContractSerializer或Asp.Net JSON序列化程序),则需要具体的类型。ORM解决方案将在设计时创建所有的表包装器类型,为数据库中的每个表提供一个具体的类型。
至于您上面特别概述的想法,特别难以实现,因为在第一个示例中,编译器动态生成一个类型,其成员与您使用的表达式的名称和类型匹配。如果你在ILSpy中打开编译后的代码,并切换到IL而不是C#,你就会明白我的意思。
因此,要动态地复制它,您需要动态地发出一个类,可能使用ILGenerator
,做同样的事情;然后动态地发出表达式树(使用Expression
类的静态工厂方法)来填充它;并最终编译和执行
如果我真的不能用其他方式做,我只会考虑做这样的事情——我更有可能只写一个例程来迭代每一列,并将JSON写入StringBuilder
并返回!但如果我可以使用ORM,那么我会改为使用ORM。