几天前我不得不将数据从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会帮助我。因此,请指导我将数据表数据反序列化到我的客户类列表。
答案 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>();
就是这样!请查看项目的主页以获取更多详细信息。