Linq select new with dynamic variable names
我想制作一个通用的数据表到 Linq 集合
我是一个乞丐,所以如果不可能,请告诉我
1 2 3 4 5 6 7 8 9 10 | 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() }; } |
那是一张桌子的代码
我想要这样的东西:
1 2 3 4 5 6 7 8 9 10 | 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?,链接到我应该使用什么将数据表序列化为 JSON在 ASP.NET 2.0 中?.
然而,我强烈建议您考虑放弃 DataTables 和 DataRows,将其替换为 ORM,例如实体框架(此处的 EF 快速入门)或 Linq to Sql - 还有其他的,但因为您是初学者这些提供了最简单的学习曲线;尤其是因为 Visual Studio 中的完整设计器支持。
对于 .Net 提供的 JSON 序列化的标准形式(例如 WCFs DataContractSerializer 或 Asp.Net JSON 序列化器),那么您需要具体的类型。 ORM 解决方案将在设计时创建您所有的表package器类型,为您提供一个具体类型,可能适用于您数据库中的每个表。
至于您在上面具体概述的想法,实现起来异常困难 - 因为在第一个示例中,编译器动态生成一个类型,其成员与您使用的表达式的名称和类型相匹配。如果您在 ILSpy 中打开编译后的代码并切换到 IL 而不是 C#,您就会明白我的意思。
因此,要动态地重现它,您需要动态地发出一个类,可能使用
如果我真的不能以任何其他方式做的话,我只会考虑做类似的事情 - 我更有可能只编写一个例程来遍历每一列并将 JSON 写入