如何将DataTable Rows Collection反序列化为List <t> </t>

时间:2011-11-11 07:50:45

标签: c# linq

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

2 个答案:

答案 0 :(得分:4)

像这样:

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

的所有属性

答案 1 :(得分:1)

您可能无法使用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>();

就是这样!请查看项目的主页以获取更多详细信息。