【问题标题】:How do I deserialize DataTable Rows Collection into List<T>如何将 DataTable 行集合反序列化为 List<T>
【发布时间】:2011-11-11 07:50:44
【问题描述】:

几天前,我不得不将数据从 xml 文件反序列化到我的 List 类。 我的做法是这样的:

private void button1_Click(object sender, EventArgs e)
{
    XmlDocument doc = new XmlDocument();
    doc.Load("Test.xml");
    XmlSerializer xs = new XmlSerializer(typeof(UserHolder));
    UserHolder uh = (UserHolder)xs.Deserialize(new StringReader(doc.OuterXml));
    dataGridView1.DataSource = uh.Users.ToDataTable();
}
public class User
{
    [XmlElement("id")]
    public Int32 Id { get; set; }

    [XmlElement("name")]
    public String Name { get; set; }
}

[XmlRoot("user_list")]
public class UserHolder
{
    private List<User> users = null;

    public UserHolder()
    {
        users = new List<User>(); 
    }

    [XmlElement("user")]
    public List<User> Users
    {
        get { return users; }
        set { users = value; }
    }
}

public static class Convert2Table
{
    public static DataTable ToDataTable<T>(this IList<T> list)
    {
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        for (int i = 0; i < props.Count; i++)
        {
            PropertyDescriptor prop = props[i];
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in list)
        {
            for (int i = 0; i < values.Length; i++)
                values[i] = props[i].GetValue(item) ?? DBNull.Value;
            table.Rows.Add(values);
        }
        return table;
    }
}

上面的代码运行良好,但我不得不写很多行代码。

我现在有一个新情况,我有一个客户类和一个数据表。我的数据表填充了多个客户数据。我想将该数据从数据表反序列化到我的客户类。我怎样才能比以前更有效地做到这一点?我怀疑linq会帮助我。所以请指导我将数据表数据反序列化到我的客户类列表。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    像这样:

    DataTable dt .... 
    
    
    List<Customer>  customers = (from c in dt.AsEnumerable()
                    select new Customer { ID = c.Field<int>("CustomerID"), 
                    Name=c.Field<string>("CustomerName")  }).ToList();
    

    Customer的所有属性以此类推

    【讨论】:

    • 我不能直接分配而不是选择新客户{ ID = c.Field("CustomerID"),这样......请讨论。
    【解决方案2】:

    可能您使用DataTable 映射到您的Customer 类的方向不正确。您现在需要一个 ORM(对象关系映射器)。 .NET 社区肯定有很多可用的 ORM。

    我是Fluent NHibernate 甚至Entity Framework 的忠实粉丝。这些总是将您的数据库表行映射到您的对象列表。

    如果您正在考虑性能并使用 .NET 的本机数据访问,您可能知道这些。然后,我强烈建议您使用Dapper,而 StackOverflow 本身使用this ORM。当性能成为问题并且需要舒适的开发和简洁的代码时,我自己会使用 Dapper。

    对于您的实例,使用 Dapper 将有一个类 Customer

    public class Customer {
        public Guid ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DateOfBirth { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public string Gender { get; set; }
        public DateTime RegistrationDate { get; set; }
    }
    

    您将数据从数据库检索到客户对象的代码是:

    IEnumerable<Customer> allCustomers = _yourDapperConnection.Query<Customer>();
    

    就是这样!查看项目主页了解更多详情。

    【讨论】:

    • 什么是_yourDapperConnection.Query...请给我完整的小代码,结果我可以理解。谢谢
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多