C# 如何将数据表行集合反序列化到列表<;T>;
几天前,我不得不将数据从xml文件反序列化到我的List类。 我的方法是这样的:C# 如何将数据表行集合反序列化到列表<;T>;,c#,linq,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 = (Us
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;
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
XmlDocument doc=新的XmlDocument();
doc.Load(“Test.xml”);
XmlSerializer xs=新的XmlSerializer(typeof(UserHolder));
UserHolder uh=(UserHolder)xs.Deserialize(新的StringReader(doc.OuterXml));
dataGridView1.DataSource=uh.Users.ToDataTable();
}
公共类用户
{
[XmlElement(“id”)]
公共Int32 Id{get;set;}
[XmlElement(“名称”)]
公共字符串名称{get;set;}
}
[XmlRoot(“用户列表”)]
公共类用户持有者
{
私有列表用户=null;
公共用户持有者()
{
用户=新列表();
}
[XmlElement(“用户”)]
公共列表用户
{
获取{返回用户;}
设置{users=value;}
}
}
公共静态类可转换
{
公共静态数据表ToDataTable(此IList列表)
{
PropertyDescriptorCollection props=TypeDescriptor.GetProperties(typeof(T));
DataTable=新的DataTable();
for(int i=0;i
上面的代码工作得很好,但我不得不写很多行代码
我现在有了一个新的情况,我有一个customer类和一个datatable。我的datatable由多个客户数据填充。我想将数据从datatable反序列化到我的customer类。我怎样才能比以前更有效地做到这一点?我怀疑林克会帮我。因此,请指导我将datatable数据反序列化到我的客户类列表中。如下:
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 dt。。。。
列出客户=(从dt.AsEnumerable()中的c开始)
选择新客户{ID=c.Field(“CustomerID”),
Name=c.Field(“CustomerName”)}.ToList();
对于客户的所有属性,依此类推,如下所示:
DataTable dt ....
List<Customer> customers = (from c in dt.AsEnumerable()
select new Customer { ID = c.Field<int>("CustomerID"),
Name=c.Field<string>("CustomerName") }).ToList();
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; }
}
DataTable dt。。。。
列出客户=(从dt.AsEnumerable()中的c开始)
选择新客户{ID=c.Field(“CustomerID”),
Name=c.Field(“CustomerName”)}.ToList();
依此类推,对于Customer
的所有属性,使用DataTable
映射到Customer
类的方向可能不正确。您现在需要一个ORM(对象关系映射器)。对于.NET社区,当然有很多可用的ORM
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; }
}
我非常喜欢Fluent NHibernate
,甚至实体框架
。这些总是将数据库表行映射到对象列表
如果您正在考虑性能和使用.NET的本机数据访问,这些可能是您所知道的。然后,我强烈建议您选择Dapper
和StackOverflow本身使用的。当性能成为一个问题,并且需要开发的舒适性和干净的代码时,我自己会使用整洁的代码
例如,使用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>();
IEnumerable allCustomers=\u yourDapperConnection.Query();
就这样!查看项目主页以了解更多详细信息。可能您使用DataTable
映射到您的客户
类的方向不正确。您现在需要一个ORM(对象关系映射器)。对于.NET社区,当然有很多可用的ORM
我非常喜欢Fluent NHibernate
,甚至实体框架
。这些总是将数据库表行映射到对象列表
如果您正在考虑性能和使用.NET的本机数据访问,这些可能是您所知道的。然后,我强烈建议您选择Dapper
和StackOverflow本身使用的。当性能成为一个问题,并且需要开发的舒适性和干净的代码时,我自己会使用整洁的代码
例如,使用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>();
IEnumerable allCustomers=\u yourDapperConnection.Query();
就这样!查看项目主页了解更多详细信息。什么是您的DapperConnection.Query。。。请给我完整的小代码,以便我能理解。谢谢你的DappeConnection是什么。查询。。。请给我完整的小代码,以便我能理解。谢谢,我不能直接分配而不是选择新客户{ID=c.Field(“CustomerID”),这样…请讨论。我不能直接分配而不是选择新客户{ID=c.Field(“CustomerID”),这样…请讨论。