[英]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.