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

Linq使用动态变量名选择new

如果你想继续使用数据表,那么在另一个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。