Как я могу создать IEnumerable из асинхронной Entity Framework?

У меня есть метод расширения, который создает выражение для возврата набора строк в базе данных:

      public static class SkillsExtensions
{
    public static IEnumerable<Skill> AllSkills(this LouisHoweDbContext context)
    {
        return context.Skills.OrderBy(s => s.Name);
    }
}

Приведенный выше код не затрагивает базу данных (пока) и поэтому не объявлен асинхронным - правильно?

Сейчас я использую это приложение Blazor (серверная часть .NET 7). Я использую элементы управления DevExpress.

      <DxFormLayoutItem Caption="Your skills:" Field="@nameof(RegisterPageModel.Skills)" ColSpanMd="6">
    <DxTagBox Data="@NoTrackingDbContext.AllSkills()"
              TextFieldName="@nameof(Skill.Name)"
              @bind-Values="@RegisterPageModel.Skills"/>
</DxFormLayoutItem>

Выше приведена страница Blazor, и поэтому я считаю, что она способна правильно обрабатывать асинхронные методы. Но я не могу это контролировать, поскольку передаю метод компоненту DevExpress.

Есть ли способ заставить это быть асинхронным? И если да, то должен ли я? Или это тот случай, когда асинхронные вызовы бесполезны?

1 ответ

Используйте async для получения значений,Dataожидает IEnumerable

       <DxTagBox Data="@allSkills" ... />

  private IEnumerable<Skill> allSkills = default!;
  overide OnInitializedAsync()
  {
    allSkills = await NoTrackingDbContext.AllSkills();
  }

и

          public static Task<IEnumerable<Skill>> AllSkills(this LouisHoweDbContext context)
    {
        return context.Skills.OrderBy(s => s.Name).ToListAsync();
    }

Хотя я сомневаюсь в использовании здесь метода расширения, сделайте его членом инъекционной службы (репозитория).

Другие вопросы по тегам