【问题标题】:converting a datatable in to a List in WCF将数据表转换为 WCF 中的列表
【发布时间】:2014-01-05 01:08:04
【问题描述】:

我正在开发 WCF RESTful 服务来以 json 格式公开数据。目前我正在使用将数据放入数据包中,然后迭代每一行并放入列表中,然后返回。但是我想跳过这个迭代并想直接将数据表转换为列表。

这样我将不再需要在我的服务中编写每个列映射...

当前代码:

[OperationContract]
[WebInvoke
(
    Method = "GET",
    BodyStyle = WebMessageBodyStyle.Bare,
    ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "Id/All"
)
]

DataTable dt = new DataTable();

dt = myData;

List<myCls> lstAllmyCls = new List<myCls>();

foreach (DataRow dr in dt.Rows)
{
    DataContactClass DataContactCls= new DataContactClass();
    DataContactCls.Id = Convert.ToInt32(dr["Id"]);
    DataContactCls.Name = dr["Name"].ToString();
    myCls.Add(DataContactCls);
}

return myCls.ToArray();

更改代码:

var convertlist = (from dr in dt.AsEnumerable()
                   select new DataContactCls()
                   {
                       Id = Convert.ToInt32(dr["Id"]),
                       Name = dr["Name"].ToString()
                   }).ToList();

但在这里我也提供了列名,我想在将列表数据作为 json 重新使用时避免使用它。

谁能提出更可行的建议?

【问题讨论】:

    标签: c# wpf json wcf wcf-rest


    【解决方案1】:

    你可以试试下面的代码

    private List<T> ConvertToList<T>(DataTable dt)
        {
            var columnNames = dt.Columns.Cast<DataColumn>()
                .Select(c => c.ColumnName)
                .ToList();
    
            var properties = typeof(T).GetProperties();
    
            return dt.AsEnumerable().Select(row =>
                {
                    var objT = Activator.CreateInstance<T>();
    
                    foreach (var pro in properties)
                    {
                        if (columnNames.Contains(pro.Name))
                            pro.SetValue(objT, row[pro.Name]);
                    }
    
                    return objT;
                }).ToList();
    
        }
    

    注意:使用反射总是会对性能产生影响

    【讨论】:

    • 获取:错误 12 方法“SetValue”没有重载需要 2 个参数。我认为当前的代码在性能方面会更可行,但任何方法都可以检查。
    【解决方案2】:

    任何人仍在寻找答案,然后我就这样做了,它可以很好地生成 JSON 数据。

    IService.cs 代码:

    [OperationContract]
            [WebInvoke(Method = "GET", UriTemplate = "/GetProducts/",
                BodyStyle = WebMessageBodyStyle.WrappedRequest,
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json)]
            List<Dictionary<string, string>> GetProducts();
    

    Service.cs 代码:

    public List<Dictionary<string, string>> GetProducts()
    {
        DataTable dtTable = loadProduct();
        Dictionary<string, string> dic = new Dictionary<string, string>();
        List<Dictionary<string, string>> plist = new List<Dictionary<string, string>>();
                    foreach (DataRow dr in dtTable.Rows)
                    {
    
                        dic.Add(dr[0].ToString(), dr[1].ToString());
    
                    }
                     plist.Add(dic);
                    return plist;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多