将数据表转换为WCF中的List

时间:2013-12-17 10:12:42

标签: c# wpf json wcf wcf-rest

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

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

当前代码:

[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重新列入时避免使用。

有人可以提出更可行的建议吗?

2 个答案:

答案 0 :(得分: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();

    }

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

答案 1 :(得分:0)

任何人仍然在寻找答案然后我就这样做了,它可以很好地生成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;
}