关于 c#:Linq select new with dynamic variable names

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#,您就会明白我的意思。

因此,要动态地重现它,您需要动态地发出一个类,可能使用 ILGenerator,做同样的事情;然后动态发出表达式树(使用 Expression 类的静态工厂方法)来填充它;最后编译执行。

如果我真的不能以任何其他方式做的话,我只会考虑做类似的事情 - 我更有可能只编写一个例程来遍历每一列并将 JSON 写入 StringBuilder 和返回那个!但是如果我可以使用 ORM,那么我会这样做。