如何转换' system.collections.generic.list'到' system.data.datatable'

时间:2017-12-25 05:28:07

标签: c#

在这里,我尝试将用户列表uow.Repository<User>().GetAll().ToList();绑定到DataTable dt,但是有一个错误说无法转换类型&#39; system.collections.generic.list&#39;到&#39; system.data.datatable&#39;在dt = uow.Repository<User>().GetAll().ToList();行。

以下是我的代码

 public DataTable GetAllUser1()
    {
        DataTable dt = new DataTable();
        dt = uow.Repository<User>().GetAll().ToList();
        return dt;
    }

任何帮助都将受到高度赞赏。谢谢。

5 个答案:

答案 0 :(得分:2)

没有太多代码和混乱使用Linq to data set

IEnumerable<DataRow> query = uow.Repository<User>().GetAll().AsEnumerable();

DataTable dt = query.CopyToDataTable<DataRow>();
  

CopyToDataTable方法使用以下过程来创建   来自查询的DataTable:

     

1. CopyToDataTable方法从源表(实现IQueryable接口的DataTable对象)克隆DataTable。该   IEnumerable源通常源自LINQ to DataSet   表达式或方法查询。

     

2.克隆的DataTable的模式是根据源表中第一个枚举的DataRow对象的列和名称来构建的。   克隆表是源表的名称,其中包含&#34; query&#34;   附加到它。

     

3.对于源表中的每一行,将行的内容复制到新的DataRow对象中,然后将其插入到克隆中   表。 RowState和RowError属性保留在整个   复制操作。如果DataRow对象,则抛出ArgumentException   在源中来自不同的表。

     

4.在复制输入可查询表中的所有DataRow对象之后,返回克隆的DataTable。如果源序列有   不包含任何DataRow对象,该方法返回一个空   数据表。

答案 1 :(得分:0)

您可以使用以下method将列表转换为 DataTable

public DataTable GetAllUser1()
{
    DataTable dt = new DataTable();
    dt =ToDataTable(uow.Repository<User>().GetAll().ToList());
    return dt;
}

public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection properties = 
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    foreach (PropertyDescriptor prop in properties)
        table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
    foreach (T item in data)
    {
        DataRow row = table.NewRow();
        foreach (PropertyDescriptor prop in properties)
             row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
        table.Rows.Add(row);
    }
    return table;
}

答案 2 :(得分:0)

DataTable dt = new DataTable();
dt = uow.Repository<User>().GetAll().ToList();

它没有那样的工作。您应该使用DataTable方法来填充它。提供一个例子可以提供更好的理解。例如; User类包含这些属性;

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }
}

您应指定DataTable;

的列
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    dt.Columns.Add("Name");

现在,您可以在一个简单的循环中添加行;

    var userList = uow.Repository<User>().GetAll().ToList();
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    dt.Columns.Add("Name");
    foreach (var user in userList)
    {
        var newRow = dt.NewRow();
        newRow["Id"] = user.Id;
        newRow["Name"] = user.Name;
        dt.Rows.Add(newRow);
    }

此外,您可以通过获取属性并使用Reflection访问它们来动态提供解决方案。

答案 3 :(得分:0)

您无法直接将列表转换为数据表

相反,你可以建立一个通用的功能。在下面的代码中提到。您需要转换列表以构建数据表行和列。

public DataTable ConvertTODataTable<T>(IList<T> data)// T is any generic type
{         
 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, prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = props[i].GetValue(item);
            }
            table.Rows.Add(values);
        }
        return table;
    }

答案 4 :(得分:0)

您可以使用以下方法将List转换为DataTable

public DataTable GetAllUser1()
{
    DataTable dt = new DataTable();
    dt = ToDataTable(uow.Repository<User>().GetAll().ToList());
    return dt;
}


public DataTable ToDataTable<T>(List<T> items)
{
    DataTable dataTable = new DataTable(typeof(T).Name);
    //Get all the properties
    PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (PropertyInfo prop in Props)
    {
        //Setting column names as Property names
        dataTable.Columns.Add(prop.Name);
    }
    foreach (T item in items)
    {
        var values = new object[Props.Length];
        for (int i = 0; i < Props.Length; i++)
        {
            //inserting property values to datatable rows
            values[i] = Props[i].GetValue(item, null);

        }
        dataTable.Rows.Add(values);
    }
    //put a breakpoint here and check datatable
    return dataTable;

}