我正在开发WCF静态服务,以json格式公开数据。目前,我正在使用将数据放入datatbale中,然后迭代每一行并放入列表中,然后返回。但是,我想跳过此迭代,并想将datatble直接转换为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退休时要避免的列名。

谁能提出更可行的建议?

最佳答案

你可以尝试下面的代码吗

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();

    }


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

09-11 19:20
查看更多