Передача IQueryable от контроллера к сервису и получение обратно конкретного спискаC#

Место общения программистов C#
Ответить
Anonymous
 Передача IQueryable от контроллера к сервису и получение обратно конкретного списка

Сообщение Anonymous »

У меня есть контроллер с конечной точкой GET, который может получать ряд параметров запроса, используемых для фильтрации записей из базы данных, а затем конечная точка возвращает список записей, прошедших фильтр.У меня есть контроллер с конечной точкой GET, который может получать ряд параметров запроса, которые используются для фильтрации записей из базы данных, а затем конечная точка возвращает список записей, прошедших фильтр. p>
В нашей текущей реализации контроллер делает все: генерирует IQueryable для кэша таблицы, добавляет фильтры на основе предоставленных параметров запроса, а затем перечисляет его как список в операторе возврата:

Код: Выделить всё

[HttpGet]
public async List QueryEntities([FromQuery] string[] entityName, [FromQuery] string[] entityTag, [FromQuery] string[] entityAttribute)
{
IQueryable queryParams = _cache.AsQueryable();

if (entityName.Length > 0)
{
queryParams = queryParams.Where(x => entityName.Contains(x.entityName);
}

if (entityTag.Length > 0)
{
queryParams = queryParams.Where(x => entityTag.Contains(x.entityTag);
}

if (entityAttribute.Length > 0)
{
queryParams = queryParams.Where(x => entityAttribute.Contains(x.entityAttribute);
}

return await queryParams.ToListAsync();
}
В рамках реализации функции я пытаюсь перенести логику и взаимодействие с базой данных в класс обслуживания. В целом это удалось, но этот конкретный метод доставил проблемы.
Моя текущая попытка заключается в том, что служба предоставляет контроллеру IQueryable в кеше, контроллер добавляет его фильтры, а затем в результате преобразования IQueryable в список.
Если я сделаю это с помощью ToListAsync, я получу ошибку:

Источник «IQueryable» не реализует «IAsyncEnumerable». Для асинхронных операций Entity Framework можно использовать только источники, реализующие IAsyncEnumerable.

Если я сделаю это синхронным (ответ CodingYourLife в разделе «Только источники, реализующие IAsyncEnumerable», могут быть используется для асинхронных операций Entity Framework), то это работает.

Код: Выделить всё

[HttpGet]
public async List QueryEntities([FromQuery] string[] entityName, [FromQuery] string[] entityTag, [FromQuery] string[] entityAttribute)
{
IQueryable queryParams = await _myEntityDataService.GetCacheQueryable();

if (entityName.Length > 0)
{
queryParams = queryParams.Where(x => entityName.Contains(x.entityName);
}

if (entityTag.Length > 0)
{
queryParams = queryParams.Where(x => entityTag.Contains(x.entityTag);
}

if (entityAttribute.Length > 0)
{
queryParams = queryParams.Where(x => entityAttribute.Contains(x.entityAttribute);
}

return queryParams.ToList();
}
Я бы предпочел сохранить асинхронное поведение. Есть ли другой способ реализовать это, который позволяет передавать фильтры запросов, сохраняя при этом асинхронность?
Что касается этого связанного вопроса: и контроллер, и класс обслуживания используют Microsoft.EntityFrameworkCore; код>. Принятый ответ не помогает в этой ситуации.
Как более общий вопрос: для меня имеет смысл, что логика обработки параметров запроса находится в самом контроллере, а не нажимается это вплоть до более низких уровней. Однако также имеет смысл, что фактическое взаимодействие с базой данных происходит внутри класса обслуживания. Мне любопытно, что думают другие о том, правильно ли я распределил обязанности, а если нет, то я был бы признателен за другие предложения.

Подробнее здесь: https://stackoverflow.com/questions/788 ... crete-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»