簡體   English   中英

ASP.Net Core:使用 LinQ Select 方法獲取用戶角色

[英]ASP.Net Core: Get User Roles with LinQ Select method

我在 Asp.Net Core 中使用 LinQ 的 select 用戶角色時遇到問題。 這是我的 function:

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 表達式無法轉換為表達式樹。

謝謝你的幫助^^

我可以建議你 2 個解決方案。 第一個是如此划分兩個步驟。 首先,獲取用戶,然后獲取角色。 我認為問題可能是EF無法將異步代碼轉換為表達式樹,然后將其轉換為SQL。 因此,單獨進行可確保您第二步是 linq 到 object 請求(不是 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
                    };

此解決方案僅發出一個數據庫請求並獲取您想要的所有數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM