Как я могу создать 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();
}
Хотя я сомневаюсь в использовании здесь метода расширения, сделайте его членом инъекционной службы (репозитория).