Linq选择具有动态变量名称的new

时间:2012-03-06 14:18:27

标签: c# json linq serialization datatable

我想为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的字符串发送。

1 个答案:

答案 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,那么我会这样做。