В моем решении на основе 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;
}
}
Связанный: Получить DataTable из регулярного запроса EF (IEnumerable): http://stackoverflow.com/questions/1253725/convert-ienumerable-to-datatable –