在我的基于实体框架的解决方案中,出于效率原因,我需要用 sql 替换我的 Linq 查询之一。此外,我希望我的结果DataTable
来自一个存储过程,以便我可以创建一个表值参数以传递给第二个存储过程。所以:
我正在使用 sql
我不想要一个DataSet
迭代一个IEnumerable
可能不会削减它 - 出于效率原因
另外,我使用的是 EF6,所以我更愿意按照原始海报的要求DbContext.SqlQuery
。ObjectContext.ExecuteStoreQuery
但是,我发现这不起作用:
_Context.Database.SqlQuery<DataTable>(sql, parameters).FirstOrDefault();
这是我的解决方案。它返回DataTable
使用 ADO.NET 获取的a SqlDataReader
- 我相信它比SqlDataAdapter
只读数据上的 a 更快。它没有严格回答这个问题,因为它使用 ADO.Net,但它显示了在从DbContext
protected DataTable GetDataTable(string sql, params object[] parameters)
{
//didn't work - table had no columns or rows
//return Context.Database.SqlQuery<DataTable>(sql, parameters).FirstOrDefault();
DataTable result = new DataTable();
SqlConnection conn = Context.Database.Connection as SqlConnection;
if(conn == null)
{
throw new InvalidCastException("SqlConnection is invalid for this database");
}
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddRange(parameters);
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
result.Load(reader);
}
return result;
}
}