En mi solución basada Entity Framework tengo que sustituir uno de mis consultas LINQ con sql, por razones de eficiencia. También quiero mis resultados en un DataTable
de un procedimiento almacenado para poder crear un parámetro de valor de tabla para pasar a un segundo procedimiento almacenado. Por lo tanto:
estoy usando SQL
no quiero una iteración DataSet
un IEnumerable
probablemente no se va a cortar - por razones de eficiencia
Además, estoy usando EF6, por lo que preferiría DbContext.SqlQuery
sobre ObjectContext.ExecuteStoreQuery
como lo solicitó el póster original.
Sin embargo, he encontrado que esto simplemente no funcionó:
_Context.Database.SqlQuery<DataTable>(sql, parameters).FirstOrDefault();
Ésta es mi solución. Devuelve un DataTable
que se obtiene utilizando un ADO.NET SqlDataReader
, que creo que es más rápido que un SqlDataAdapter
en datos de solo lectura. No responde estrictamente a la cuestión, ya que utiliza ADO.Net, pero muestra cómo hacerlo después de conseguir un asimiento de la conexión desde el 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;
}
}
Relacionado: Obtenga una DataTable de una consulta EF normal (un IEnumerable): http://stackoverflow.com/questions/1253725/convert-ienumerable-to-datatable –