Как асинхронно дождаться операции соединения и использовать ее при втором соединении в c#? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть метод, который я использую 2 операции соединения. Мне нужно достичь первого результата, а затем использовать его во втором соединении. Я использовал оба подхода syn c и asyn c, но в результате я получаю пустой массив и предупреждаю вот так

warn: Microsoft.EntityFrameworkCore.Query[20500]
  The LINQ expression 'where ([org].Name == {from Organization org in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[LibvirtManagement.Models.Organization]) join User user in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[User]) on [org].Id equals [user].OrganizationId where ([user].Username == __username_0) select new <>f__AnonymousType10`1(org = [org].Name)}.ToString())' could not be translated and will be evaluated locally.

Мой метод выглядит как syn c версия:

[HttpGet("orgprojectmod")]
public  IActionResult GetOrganizationUsersForModerator()
{
    string userRole = "moderator";
    if (userRole != User.FindFirst(ClaimTypes.Role).Value)
        return BadRequest("You need to be in moderator mode to access this request");

    var username = User.FindFirst(ClaimTypes.Name).Value;

    var test = from org in _context.Organizations
        join user in _context.Users on org.Id equals user.OrganizationId
        where user.Username == username
        select new
        {
            org = org.Name
        };

    var test2 = from org in _context.Organizations
        join user in _context.Users on org.Id equals user.OrganizationId
        where org.Name == test.ToString()
        select new
        {
            usernames = user.Username,
            roles = user.Role,
            org = org.Name
        };

    return Ok(test2);
}

Asyn c версия:

        [HttpGet("orgprojectmod")]
        public async  Task<IActionResult> GetOrganizationUsersForModerator()
        {
            string userRole = "moderator";
            if (userRole != User.FindFirst(ClaimTypes.Role).Value)
                return BadRequest("You need to be in moderator mode to access this 
               request");

            var username = User.FindFirst(ClaimTypes.Name).Value;

            var test = await _context.Organizations
                .Join(_context.Users, org => org.Id, user => user.OrganizationId, (org, 
               user) => new {org, user})
                .Where(@t => @t.user.Username == username)
                .Select(@t => new {org = @t.org.Name}).ToListAsync();

            var test2 = await _context.Organizations
                .Join(_context.Users, org => org.Id, user => user.OrganizationId, (org, 
                  user) => new {org, user})
                .Where(@t => @t.org.Name == test.ToString())
                .Select(@t => new {usernames = @t.user.Username, roles = @t.user.Role, org = 
              @t.org.Name}).ToListAsync();

            return Ok(test2);
        }

Прежде всего мне нужно получить OrganizationName, а затем перечислить все UserName, UserRole и OrganizationName в соответствии с этим OrganizationName.

1 Ответ

1 голос
/ 24 марта 2020

Ошибка говорит, что вы передали неправильный параметр. С вашим кодом вы пытаетесь toString () полностью IEnumerable <> (ваша переменная «test»)

.Where(@t => @t.org.Name == test.ToString())

Измените его на

var selectedOrg = test.FirstOrDefault().org;
.....
.Where(@t => @t.org.Name == selectedOrg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...