我正在开发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();
}
注意:使用反射时始终会对性能产生影响