【发布时间】:2019-12-06 11:58:52
【问题描述】:
我正在尝试从 DataTable 转换为 IEnumerable<T>。但我得到的是IEnumerable<DataRow>:
using (var con = new SqlConnection(Connection.ToString()))
{
con.Open();
using (var cmd = con.CreateCommand())
{
cmd.CommandTimeout = int.MaxValue;
cmd.CommandText = sqlCommand;
var reader = cmd.ExecuteReader();
DataTable tbl = new DataTable();
tbl.Load(reader);
var res = tbl.AsEnumerable().ToList(); // IEnumerable<DataRow>:
}
}
我想做的是:
protected async Task<IEnumerable<T>> QuerySqlCmdReadRows<T>(string sqlCommand)
{
using (var con = new SqlConnection(Connection.ToString()))
{
con.Open();
using (var cmd = con.CreateCommand())
{
cmd.CommandTimeout = int.MaxValue;
cmd.CommandText = sqlCommand;
var reader = cmd.ExecuteReader();
DataTable tbl = new DataTable();
tbl.Load(reader);
return tbl.AsEnumerable().ToList();
}
}
}
是否可以像我在Entity Framework 中那样获得IEnumerable<T>?
var studentList = ctx.SqlQuery("Select * from Students")
.ToList<Student>();
【问题讨论】:
-
DataTable 是 DataRow 对象的集合,因此 IEnumerable
是唯一有用的转换。您是否正在寻找将关系数据映射到对象的方法?这是 ORM 的工作。如果你想要具体的对象,请使用 EF 或像 Dapper 这样的 microORM -
使用Dapper,您可以编写,例如
var results=con.Query<SomeType>("select .....");,Dapper 将根据属性名称将结果行转换为对象。它也不会将结果加载到 DataTable 中,它会在从 DbDataReader 读取时发出映射的对象
标签: c# generics .net-core datatable ado.net