Я пытаюсь вернуть HTTP-ответ, состоящий из массива записей, которые я выбрал из базы данных. Но у меня возникли проблемы с сопоставлением моего IDataReader
с Enumerable
. Вот часть моего кода, которая имеет отношение к делу:
namespace Web.Api.Controllers
{
public static class Blah
{
public static IEnumerable<T> Select<T>(this IDataReader reader,
Func<IDataReader, T> projection)
{
while (reader.Read())
{
yield return projection(reader);
}
}
}
[HttpPost]
[Route("Search")]
public async Task<Tuple<int, IEnumerable<CustomerViewModel>, int>> Search([FromBody]CustomerViewModel model)
{
var s = _configuration.GetConnectionString("DefaultConnectionAlt");
using (SqlConnection connection = new SqlConnection(s))
{
connection.Open();
using (SqlCommand command = new SqlCommand("Search @RegistrationDate=\"2020-07-09\"", connection))
{
using (IDataReader reader = command.ExecuteReader())
{
var results = reader.Select<CustomerViewModel>(CustomerViewModel.Create);
return Tuple.Create(0, results, 29);
}
}
}
}
}
Когда я отправляю запрос POST на http://localhost:42432/api/Search
, строка while (reader.Read())
выдает ошибку:
System.InvalidOperationException: 'Invalid attempt to call Read when reader is closed.'
Я помещаю точка останова в return Tuple.Create(0, results, 29);
, и когда я проверяю переменную results
, она показывает ожидаемые результаты. Но после того, как я выйду из этой точки останова, я получаю сообщение об ошибке while (reader.Read())
.
Может кто-нибудь сказать мне, как я могу исправить свою проблему?
Я следовал приведенным здесь примерам:
Как я могу легко преобразовать DataReader в список ?
Преобразовать строки из считывателя данных в набранные результаты
EDIT - я использую dotnetcore