我想为Linq Collection制作一个通用的数据表 我是一个beggginer因此,如果不可能请告诉我
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的字符串发送。
答案 0 :(得分:2)
如果你想继续使用数据表,那么就会出现这种情况,在另一个SO中提到:What should I use to serialize a DataTable to JSON in ASP.NET 2.0?,它链接到What should I use to serialize a DataTable to JSON in ASP.NET 2.0?。
但我强烈建议您考虑远离DataTables和DataRows,而是使用ORM(例如实体框架(EF Quick Start here)或Linq to Sql替换它 - 还有其他的,但是因为你是一个初学者提供最简单的学习曲线;尤其是因为Visual Studio中的完整设计器支持。
对于.Net提供的标准形式的JSON序列化(例如WCF DataContractSerializer或Asp.Net JSON序列化程序),您需要具体的类型。 ORM解决方案将在设计时创建所有表包装器类型,为您提供数据库中每个表的具体类型。
至于你上面特别概述的想法,异常很难实现 - 因为在第一个例子中,编译器动态生成一个类型,其成员与名称和类型相匹配你使用的表达。如果您在ILSpy中打开已编译的代码并切换到IL而不是C#,您将看到我的意思。
因此,要动态地重现它,你需要动态地发出一个类,可能使用ILGenerator
做同样的事情;然后动态发出表达式树(使用Expression
类'静态工厂方法)来填充它;最后编译并执行它。
如果我不能以任何其他方式做到这一点,我只会考虑做类似的事情 - 我更有可能只编写一个例程来遍历每一列并将JSON写入{{1}并返回!但是,如果我可以使用ORM,那么我会这样做。