在这里,我尝试将用户列表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;
}
任何帮助都将受到高度赞赏。谢谢。
答案 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;
}