【问题标题】:ASP.Net Core: Get User Roles with LinQ Select methodASP.Net Core:使用 LinQ Select 方法获取用户角色
【发布时间】:2020-09-18 03:06:59
【问题描述】:

在 Asp.Net Core 中使用 LinQ 选择用户角色时遇到问题。这是我的功能:

public async Task<ApiResult<PagedResult<UserViewModel>>> GetUserPaging(PagingRequestBase request)
{
    if(request==null) return new ApiErrorResult<PagedResult<UserViewModel>>("Invalid request");
    var query= await userManager.Users.Skip((request.PageIndex-1)*request.PageSize)
    .Take(request.PageSize)
    .Select(async x => new UserViewModel{
        UserName=x.UserName,
        Dob=x.Dob,
        Email=x.Email,
        FirstName=x.FirstName,
        LastName=x.LastName,
        Roles=await userManager.GetRolesAsync(x)
    }).ToListAsync();
}

我想在 Select 方法中使用 async 关键字以便使用:await userManager.GetRolesAsync(x) 但智能感知警告我:

异步 ​​lambda 表达式无法转换为表达式树。

感谢您的帮助^^

【问题讨论】:

标签: c# linq asp.net-core user-roles


【解决方案1】:

我可以建议您 2 个解决方案。 第一个是如此划分两个步骤。首先,获取用户,然后获取角色。我认为问题可能是 EF 无法将异步代码转换为表达式树,然后将其转换为 SQL。因此,单独制作它可以确保您第二步是 linq 到对象请求(而不是 linq 到 SQL)。此解决方案的问题是您对数据库提出了很多请求。就是N+1问题。

public async Task<ApiResult<PagedResult<UserViewModel>>> GetUserPaging(PagingRequestBase request)
{
    if(request==null) return new ApiErrorResult<PagedResult<UserViewModel>>("Invalid request");
    var users = await userManager.Users.Skip((request.PageIndex-1)*request.PageSize)
    .Take(request.PageSize)
    .ToListAsync();

    var query = users.Select(async x => new UserViewModel{
        UserName=x.UserName,
        Dob=x.Dob,
        Email=x.Email,
        FirstName=x.FirstName,
        LastName=x.LastName,
        Roles=await userManager.GetRolesAsync(x)
    })
}

因此,这为我们指明了第二种方法。它直接向 EF 数据库上下文发出请求,并显式地加入:

            YourfDbContext t = null;  // this is only for pointing it

            var x = from usr in t.Users 
                    join userRole in t.UserRoles on usr.Id equals userRole.UserId 
                    join role in t.Roles on userRole.RoleId equals role.Id into roles
                    select new {
                        User = usr,
                        Roles = roles
                    };

此解决方案仅发出一个数据库请求并获取您想要的所有数据。

【讨论】:

  • 嗨@dnguyen244!我看你是新的!我邀请您与 Stackoverflow 合作!如果这个答案对你有帮助,应该投赞成票,或者如果它是错误的(或非常糟糕的答案),你应该投反对票。此外,如果它是您的正确答案,您应该将其标记为已接受的答案!薄纱
猜你喜欢
  • 2017-09-19
  • 2018-01-08
  • 2015-07-17
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2016-09-29
  • 2020-07-12
  • 2021-11-17
相关资源
最近更新 更多