2011-11-11 20 views
1

幾天前我不得不將數據從xml文件反序列化到我的List類。 我的方法是這樣的:上面如何將DataTable行集合反序列化到列表中<T>

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會幫助我。所以請指導我反序列化數據表數據到我的客戶類列表。

回答

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(); 

等了大概你不是在正確的方向上使用DataTable進出映射到您CustomerCustomer

+0

我不能直接分配,而不是選擇新的客戶{ID = c.Field (「CustomerID」),這樣.... plzz討論。 –

1

的所有屬性。您現在需要一個ORM(對象關係映射器)。 .NET社區肯定有很多ORM可用。我很喜歡Fluent NHibernate甚至Entity Framework。這些總是將您的數據庫表格行映射到您的對象列表。

也許這些對您而言是已知的,如果您正在考慮性能和使用.NET的本機數據訪問。然後,我會強烈建議你去Dapper和StackOverflow本身使用this ORM。我自己在性能成爲問題時使用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>(); 

這就是它!查看該項目的主頁瞭解更多詳情。

+0

什麼是_yourDapperConnection.Query ...請給我完整的小代碼,因爲我能理解。謝謝 –