Переопределение GetRolesAsync - PullRequest
1 голос
/ 12 марта 2020

То, что я хотел бы сделать, это

public override Task<IList<string>> GetRolesAsync(ApplicationUser user, CancellationToken cancellationToken = default)
{
    return Context.UserOrganisationRole
        .Where(z => z.UserId == user.Id)
        .GroupBy(z => new { z.RoleId, z.Role })
        .Select(z => z.Key.Role.Name + "-" + string.Join(",", z.OrderBy(z => z.OrganisationId).Select(z => z.OrganisationId)))
        .ToListAsync();
}

Но это не работает, потому что Task<List<string>> не может быть приведено к Task<IList<string>>.

Поэтому я попытался добавить

.ContinueWith<IList<string>>(t => t.Result, TaskContinuationOptions.ExecuteSynchronously);

из Ошибка преобразования типа при асинхронном c программировании , который компилируется, но не запускается, потому что:

Выражение LINQ <... > Не удалось перевести. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов функции AsEnumerable (), ...

Что, я думаю, означает, что он пытается сделать слишком много в базе данных. Хорошо. Однако, добавив запрошенный IEnumerable, теперь кажется невозможным получить требуемый Task<IList<string>> для возврата

return Context.UserOrganisationRole
    .Where(z => z.UserId == user.Id)
    .AsEnumerable()
    .GroupBy(z => new { z.RoleId, z.Role })
    .Select(z => z.Key.Role.Name + "-" + string.Join(",", z.OrderBy(z => z.OrganisationId).Select(z => z.OrganisationId)))

Т.е. напишите это для меня!

public Task<IList<string>> ListToTaskIList (IList<string> list)
{

}

1 Ответ

2 голосов
/ 12 марта 2020

Просто await Результат запроса:

public async override Task<IList<string>> GetRolesAsync(ApplicationUser user, CancellationToken cancellationToken = default)
{
    return await Context.UserOrganisationRole
        .Where(z => z.UserId == user.Id)
        .GroupBy(z => new { z.RoleId, z.Role })
        .Select(z => z.Key.Role.Name + "-" + string.Join(",", z.OrderBy(z => z.OrganisationId).Select(z => z.OrganisationId)))
        .ToListAsync();
}
...