Хранимая процедура, возвращающая набор данных в. NET Core 3.1 - PullRequest
0 голосов
/ 08 апреля 2020

Используя Entity Framework 6.3, я пытаюсь выполнить хранимую процедуру, которая возвращает набор данных (в результате оператора select в процедуре, которая объединяет несколько таблиц). Хранимая процедура существует, и я могу выполнить ее через SSMS, используя те же учетные данные, просто чтобы исключить очевидные предложения.

Вызов хранимой процедуры выглядит следующим образом:

using Microsoft.Data.SqlClient; //!

var timestamp = new DateTime.UtcNow();
var scheduleNo = "123";
var machine = "3";

var result = await DbContext.Database.SqlQuery<ScheduleData>(
    "exec GetScheduleData @UpdateTimeStamp, @ScheduleNo, @Machine",
        new SqlParameter("@UpdateTimeStamp", timestamp),
        new SqlParameter("@ScheduleNo", scheduleNo),
        new SqlParameter("@Machine", machine))
    .ToListAsync();

Выполнение завершается с ошибкой:

SqlParameterCollection принимает только ненулевой SqlParameter введите объекты, а не объекты SqlParameter.

Я искал эту точную ошибку, нашел похожий вопрос здесь , но я не думаю, что он применим, так как оригинальный постер этого не делает даже используйте EF.

Ответ на этот вопрос не представляется применимым, так как я уже использую Microsoft.Data.SqlClient (как подчеркнуто в листинге выше).

В DbContext не определено DbSet, которое соответствовало бы результирующему набору, возвращаемому из процедуры, поэтому я не могу использовать DBSet<ScheduleData>.FromSql или .FromSqlRaw.

FWIW, мне нужно, чтобы набор результатов был доступен только для чтения, поэтому не нужно отслеживать изменения EF и т. Д. c.

Есть ли способ сделать это без полного обхода EF и создать отдельное соединение с БД?

1 Ответ

0 голосов
/ 20 апреля 2020

Вы можете использовать метод расширения из B3.Extensions.Data . Любой необработанный запрос sql может выполняться с использованием структуры сущностей, например:

public async Task<IActionResult> Get()
{
   var sql = "SELECT type, SUM(length) FROM ways GROUP BY type";
   var queryResult = await _context.ExecuteQueryAsync(sql);

   return Ok(response);
}
...