我正在尝试将数据表转换为Web服务中的列表以在java脚本中获取它。我尝试了下面的代码
rows = (from p in dt.AsEnumerable()
select new TableProperty() { }).ToList<TableProperty>();
for (int i = 0; i < rows.Count; i++)
{
// Get List of table Properties..
List<TableProperty> tProperties = new List<TableProperty>();
for (int j = 0; j < dt.Columns.Count; j++)
{
try
{
TableProperty propertyValue = new TableProperty()
{
name = dt.Columns[j].ToString(),
serial = dt.Columns[j].ToString(),
address = dt.Columns[j].ToString(),
mobile = dt.Columns[j].ToString(),
password = dt.Columns[j].ToString()
};
tProperties.Add(propertyValue);
}
catch (Exception ex)
{
ex.ToString();
}
}
}
return rows;
其中dt是我的数据表,TableProperty是我设置并获取我的属性的类
当我在java脚本中获取它时,我的值返回null
function draw_Result(ddata) {
alert(ddata.length);
for (var i = 0; i < ddata.length; i++) {
alert("for");
try
{
var post = ddata[i].name.toString();
alert(post);
}
catch (e)
{
alert(e.message);
}
}
}
任何帮助
答案 0 :(得分:0)
rows = (from p in dt.AsEnumerable()
select new TableProperty() { }).ToList<TableProperty>();
您是否尝试过调试程序,以便在分配之后查看rows
是什么?
此外,您似乎首先分配rows
,然后循环遍历该集合,仅创建一个全新的集合tProperties
(可能包含您期望的内容),最后你再次返回rows
。 tProperties
的目的是什么?
看起来rows
是一个空的TableProperty
对象列表 - 因为对于每一行(from p in dt.AsEnumerable()
),您选择一个空对象(select new TableProperty() { }
)和最后将枚举转换为仍然为空的对象列表。
您需要在创建TableProperty
时进行映射 - 但这意味着您知道有多少列:
rows = (from p in dt.AsEnumerable()
select new TableProperty() {
name = p[0].ToString(),
serial = p[1].ToString(),
address = p[2].ToString(),
mobile = p[3].ToString(),
password = p[4].ToString()
}).ToList<TableProperty>();
如果你不知道预期有多少列,你可以随时使用普通的Enumerable - 即使用for
循环
var rows = dt.AsEnumerable()
答案 1 :(得分:0)
只是一个提示:您总是可以对DataTable对象进行扩展。当您调用扩展DataTable对象时,可以执行以下操作:
List<TableProperties> ListOfTableProperties = YourDataTable.DataTableToList<TableProperties>();
以下是如何操作:
假设你有这个数据模型(一个类):
public class TableProperties
{
public int Indexer { get; set; }
public string DisplayName { get; set; }
public string TypeName { get; set; }
}
..您可以使用此数据表:
DataTable tbl = new DataTable("test");
tbl.Columns.Add("Indexer");
tbl.Columns.Add("DisplayName");
tbl.Columns.Add("TypeName");
tbl.Rows.Add(2, "teststring1", "teststring2");
..当你这样做时:
List<TableProperties> urk = tbl.DataTableToList<TableProperties>();
...你得到一个TableProperties类型的列表。
您需要的扩展可以放在项目中某个地方的静态类中。以下是制作此类的代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Web;
public static class ExtensionMethods
{
/// <summary>
/// Converts a DataTable to a strongly typed list
/// </summary>
/// <typeparam name="T">Generic object</typeparam>
/// <param name="table">DataTable</param>
/// <returns>List with generic objects</returns>
public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
{
try
{
List<T> list = new List<T>();
foreach (var row in table.AsEnumerable())
{
T obj = new T();
foreach (var prop in obj.GetType().GetProperties())
{
try
{
PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
}
catch
{
continue;
}
}
list.Add(obj);
}
return list;
}
catch
{
return null;
}
}
}
请注意,例如,最终结果中的整数不包含在引号中;在扩展方法中有一个类型检查。请记住,属性的名称必须与DataTable对象的字段名称相对应。
如果您不知道字段名称和/或手头没有数据模型,可以使用Linq。