簡體   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