В моем решении на основе Entity Framework мне нужно заменить один из моих запросов Linq на sql - из соображений эффективности.
Также я хочу, чтобы мои результаты в DataTable
из одной хранимой процедуры, чтобы я мог создать параметр табличного значения для передачи во вторую хранимую процедуру. Итак:
Я использую sql
Я не хочу DataSet
Повторение IEnumerable
, вероятно, не приведет к его сокращению - по соображениям эффективности
Кроме того, я использую EF6, поэтому я бы предпочел DbContext.SqlQuery
вместо ObjectContext.ExecuteStoreQuery
, как запрошенный оригинальный плакат.
Однако я обнаружил, что это просто не работает:
_Context.Database.SqlQuery<DataTable>(sql, parameters).FirstOrDefault();
Это мое решение. Он возвращает DataTable
, который выбирается с помощью ADO.NET SqlDataReader
- который, я считаю, быстрее, чем SqlDataAdapter
для данных только для чтения. Он не дает точного ответа на вопрос, поскольку использует 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;
}
}