繁体   English   中英

如何将DataTable行集合反序列化为列表<T>

[英]How do I deserialize DataTable Rows Collection into List<T>

几天前,我不得不将数据从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会帮助我。 因此,请指导我将数据表数据反序列化到我的客户类别列表中。

像这样:

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所有属性,依此类推

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

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

这些可能是您已知的,并且如果您正在考虑性能并针对.NET使用本机数据访问。 然后,我强烈建议您选择Dapper而StackOverflow本身使用此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>();

而已! 请查看项目的主页以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM