Sql server 在C#中提取DataTable列的子集,然后将它们作为JSON字符串发送到浏览器客户端

Sql server 在C#中提取DataTable列的子集,然后将它们作为JSON字符串发送到浏览器客户端,sql-server,json,c#-4.0,datetime,system.data.datatable,Sql Server,Json,C# 4.0,Datetime,System.data.datatable,下面是一个场景:C#中间层webservice将从SQL Server发送的数据放在System.data.DataTable对象中。DataTable的columns集合中有几十列。浏览器客户端只需要看到其中的六个。服务器上存储的进程是通用的,不是为这个特定任务设计的。假设我们必须使用它,而不是编写新的SP 是否有一种简单的方法(可能使用泛型)将所需的列子集从该数据表提取到列表或集合中,然后使用JSON.NET将结果列表或集合转换为JSON 是否可以使用相关字段名(和数据类型)创建一个骨架C类

下面是一个场景:C#中间层webservice将从SQL Server发送的数据放在System.data.DataTable对象中。DataTable的columns集合中有几十列。浏览器客户端只需要看到其中的六个。服务器上存储的进程是通用的,不是为这个特定任务设计的。假设我们必须使用它,而不是编写新的SP

是否有一种简单的方法(可能使用泛型)将所需的列子集从该数据表提取到列表或集合中,然后使用JSON.NET将结果列表或集合转换为JSON

是否可以使用相关字段名(和数据类型)创建一个骨架C类定义
foo
,然后“自动”匹配这些字段名,从而从数据表的行集合生成一个
列表


理想情况下,在JSON转换过程中,任何SQL Server日期时间值(例如,
2014-06-24T18:45:00
)都将转换为一个值,该值可以轻松地在客户端中实例化javascript日期,而无需对日期表示进行字符串操作。

下面粘贴了完整的工作控制台应用程序代码。但您需要的两种主要方法如下

要使此代码正常工作,您必须在项目中执行以下操作

  • JSON.Net
    Nuget包添加到项目中
  • 添加对
    System.Web.Extensions
    的引用(如果在
    GetJson
    方法中引用
    System.Web.Script.Serialization.JavaScriptSerializer
    的行中出现编译错误)

    /// <summary>
    /// Returns Json representation of Generic class with only matching properties from the DataTable (passed as parameter)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static string GetJsonFromDataTable<T>(DataTable dt) where T : new()
    {
        string json = GetJson(dt);
        return JsonConvert.SerializeObject(JsonConvert.DeserializeObject<List<T>>(json));
    }
    
    /// <summary>
    /// Returns a JSON string for entire DataTable (passed as parameter)
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static string GetJson(DataTable dt)
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string, object>> rows = (from DataRow dr in dt.Rows select dt.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName.Trim(), col => dr[col])).ToList();
        return serializer.Serialize(rows);
    }
    
    代码说明: 注意,我有两个类,
    Patient
    PatientDrug
    。 我编写了helper方法来返回两个类的数据表,这两个类都有额外的列。 然后,下面两行分别为
    Patient
    PatientDrug
    获取类表示的JSON,同时忽略DataTable中与名称不匹配的其他数据列

    string patientDrugJson = GetJsonFromDataTable<PatientDrug>(patientDrugDataTable);
    string patientJson = GetJsonFromDataTable<Patient>(patientDataTable);
    
    string patientDrugJson=GetJsonFromDataTable(patientDrugDataTable);
    字符串patientJson=GetJsonFromDataTable(patientDataTable);
    
    控制台窗口中的输出(json字符串)

    非常感谢这个工作示例。在我正式接受答案之前,我必须先研究代码——您使用一些我不熟悉的C#技能:-)
    string patientDrugJson = GetJsonFromDataTable<PatientDrug>(patientDrugDataTable);
    string patientJson = GetJsonFromDataTable<Patient>(patientDataTable);