我想要一个函数,它接受一个数据表并返回一个List(对象不是DataRow)例如.:
我知道我可以这样做(但这需要知道列名):
// Datatable dt = Filled from a Database query & has 3 columns Code,Description & ShortCode
List<object> rtn = new List<object>();
var x = from vals in dt.Select()
select new
{
Code = vals["Code"],
Description = vals["Description"],
ShortCode = vals["ShortCode"],
};
rtn.AddRange(x)
return rtn;
Run Code Online (Sandbox Code Playgroud)
我想要的是一个通用版本,以便我可以传入任何数据表,它将根据数据表中的列名生成.
由于在编译时不知道属性名称,并且您希望将数据用于JSON序列化,因此可以使用以下命令创建字典列表.如果使用Newtonsoft JSON,则序列化负责转换JSON对象格式的键值对.
IEnumerable<Dictionary<string,object>> result = dt.Select().Select(x => x.ItemArray.Select((a, i) => new { Name = dt.Columns[i].ColumnName, Value = a })
.ToDictionary(a => a.Name, a => a.Value));
Run Code Online (Sandbox Code Playgroud)
为了动态创建属性以便处理具有不同列集的不同数据表,我们可以使用System.Dynamic.ExpandoObject。它基本上实现了 IDictionary <string,object>。该格式可以轻松转换为 JSON。
int colCount = dt.Columns.Count;
foreach (DataRow dr in dt.Rows)
{
dynamic objExpando = new System.Dynamic.ExpandoObject();
var obj = objExpando as IDictionary<string, object>;
for (int i = 0; i < colCount; i++)
{
string key = dr.Table.Columns[i].ColumnName.ToString();
string val = dr[key].ToString();
obj[key] = val;
}
rtn.Add(obj);
}
String json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(rtn);
Run Code Online (Sandbox Code Playgroud)