В нашей текущей реализации контроллер делает все: генерирует 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
Мобильная версия