将数据表转换为列表<>

时间:2014-02-22 18:52:29

标签: c# javascript asp.net

我正在尝试将数据表转换为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);
            }

        }
    }

任何帮助

2 个答案:

答案 0 :(得分:0)

rows = (from p in dt.AsEnumerable()
        select new TableProperty() { }).ToList<TableProperty>();

您是否尝试过调试程序,以便在分配之后查看rows是什么?

此外,您似乎首先分配rows,然后循环遍历该集合,仅创建一个全新的集合tProperties(可能包含您期望的内容),最后你再次返回rowstProperties的目的是什么?

看起来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。