我正在开发一个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重新列入时避免使用。
有人可以提出更可行的建议吗?
答案 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;
}