Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据表行集合反序列化到列表<;T>;_C#_Linq - Fatal编程技术网

C# 如何将数据表行集合反序列化到列表<;T>;

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

几天前,我不得不将数据从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;
    }
}
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”),这样…请讨论。