[英]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.