Возврат компонента представления IAsyncEnumerable в ядре asp.net - PullRequest
0 голосов
/ 11 октября 2018

У меня есть этот проект, который работает нормально:

класс обслуживания:

 public async Task<IAsyncEnumerable<ContratoDTO>> ContratoServiceGetAll()
    {
        List<ContratoDTO> listaDeContrato = new List<ContratoDTO>();
        listaDeContrato = await ContratoRepository.GetAllAsync().Result.Select(u => new ContratoDTO(u)).ToList();
        return listaDeContrato.ToAsyncEnumerable();
    }

ViewComponent Class:

public async Task<IViewComponentResult> InvokeAsync()
    {
        ContratoViewModel listaContrato = new ContratoViewModel
        {
            Contratos = await ContratoSerivce.ContratoServiceGetAll()
        };
         return View(listaContrato);
    }

и мой компонент в папке Shared View:

   <tbody>
        @if (Model.Contratos != null)
        {
            @foreach (var item in Model.Contratos.ToEnumerable())
            {

                <tr>
                    <th scope="row">@item.NuContrato</th>
                    <td>@item.VlContrato</td>
                    <td>36</td>
                    <td>@item.DtEmissao</td>
                    <td>@item.DtRetorno</td>
                    <td>Rio de Janeiro</td>
                </tr>
            }
        }
    </tbody>

Это работает, но Model.Contratos.ToEnumerable () это лучший подход?Если я возьму метод ToEnumerable (), он выдаст ошибку:

'Error CS0202: foreach requires that the return type 'IAsyncEnumerator<ContratoDTO>' of 'IAsyncEnumerable<ContratoDTO>.GetEnumerator()' must have a suitable public MoveNext method and public'

ps: ContratoViewModel имеет свойство универсального типа IAsyncEnumerable типа T my DTO.

1 Ответ

0 голосов
/ 31 августа 2019

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

IAsyncEnumerable<T> можно ожидать так же, как Task<T>.Это не должно быть завернуто.Комментарий к вашему вопросу показывает, что вы можете потерять преимущество IAsyncEnumerable<T>, если вы используете .Result.Select(u => new ContratoDTU(u)).ToList();.Я согласен с тем, что .ToList() является синхронным и будет блокироваться до его завершения.

При использовании переменных в вашем классе обслуживания ниже приведена краткая ревизия:

public async IAsyncEnumerable<ContratoDTO> ContratoServiceGetAll()
{
    foreach (var u in await ContratoRepository.GetAllAsync())
        yield return new ContratoDTO(u);
}

Кроме того, *Оператор 1013 * в вашем компоненте (при условии, что вы имели в виду .AsEnumerable() из метода расширения Enumerable.AsEnumerable<TSource>(this IEnumerable<TSource> source)) заставит представление в этот момент заблокировать выполнение запроса Model.Contractos (опять же, если ContractoRepository.GetAllAsync() возвращает IQueryable<T>).

Излишне иметь .ToEnumerable(), так как итерация начнется после оценки @foreach (var item in Model.Contractos).

...