【问题标题】:Linq select new with dynamic variable namesLinq 使用动态变量名称选择新的
【发布时间】:2012-03-06 14:18:26
【问题描述】:

我想为 Linq 集合制作一个通用数据表 我是一个乞丐,所以如果不可能,请告诉我

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

【问题讨论】:

标签: c# json linq serialization datatable


【解决方案1】:

如果您想继续使用数据表,那么有这个,在另一个 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,例如 Entity Framework (EF Quick Start here) 或 Linq to Sql - 还有其他的,但由于您是初学者,因此这些提供最简单的学习曲线;尤其是因为 Visual Studio 中的完整设计器支持。

对于 .Net 提供的标准 JSON 序列化形式(例如 WCFs DataContractSerializer 或 Asp.Net JSON 序列化器),您需要具体的类型。 ORM 解决方案将在设计时创建所有表包装器类型,为您的数据库中的每个表提供一个具体的类型。

至于您在上面具体概述的想法,异常很难实现 - 因为在第一个示例中,编译器会动态生成一个类型,其成员与你使用的表达方式。如果你在ILSpy 中打开编译后的代码并切换到 IL 而不是 C#,你就会明白我的意思了。

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

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

【讨论】:

  • 很抱歉,要么你忘记了初学者是怎样的,要么我太初学者了,我迷失了迷失在你的答案中,我觉得如果其他人阅读它,他们会达到他们的目标,但是我只是迷路了,我已经看到返回 JSON 的实体框架查询,但是由于我是初学者并且我不知道如何使用 EFW,所以可以将数据表转换为实体框架吗?学习实体框架并使用它重新设计我的网络服务对我来说太过分了,我什至不知道从哪里开始你链接的类,如果你能详细说明一下,谢谢。PS:速度是个问题
  • 当我说速度是一个问题时,我的意思是我运行代码以达到 JSON 的时间很重要,我并不是要催促你,我已经修改了我的代码以使用 JSON。 NET 库,但在转换大数据表时它比内置序列化程序慢
  • @Shereef - 你好 - 我明白你在说什么,但不幸的是,完全按照你的要求去做确实是一件复杂的事情,可能是初学者的事情不应该尝试,由于它的复杂性,我个人会回避它,而且我对生成动态代码和表达式树很满意!如果您使用 EF 或 L2S,您将不再使用数据表 - 所有表都包装在强类型类中,使其变得容易得多。我推荐 EF 快速入门 msdn.microsoft.com/en-us/library/bb399182.aspx - 它会教你很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多