【发布时间】:2021-12-25 04:02:36
【问题描述】:
这个问题已经askedbefore 回答过几次,但不是以一般的方式回答。相反,答案是针对提问者的(这是有道理的)......但我经常使用这种模式,我相信其他人也会这样做,所以我正在寻找一个更普遍的答案。我知道为什么会发生这种情况,但我不确定该怎么做。下面的违规行是
RoleId = ur.First(xu => xu.UserId == x.Id).RoleId,
我的理解是,我必须在投影之前以某种方式对其进行转换,但这就是我遇到的问题。或者使用Contains() 而不是First()(这是一个隐含的Where() 过滤器),但我不确定如何重写它,以便服务器将执行查询,而不是客户端。最好的前进方式是什么?
var roles = await _roleManager.Roles.ToListAsync();
var rolesList = roles.Select(x => new {x.Id, x.Name}).ToList();
var rid = ur.First(xu => xu.UserId == 4).RoleId;
var ur = await _context.UserRoles.ToListAsync();
var appUsers = await _context.Users
.Select(x => new AppUserViewModel
{
Id = x.Id,
StaffId = x.StaffId,
Email = x.Email,
UserName = x.UserName,
PhoneNumber = x.PhoneNumber,
RoleId = ur.First(xu => xu.UserId == x.Id).RoleId,
RoleSelectListItems = rolesList.Select(yy => new SelectListItem
{
Value = yy.Id.ToString(),
Text = yy.Name
}).ToList()
})
.ToListAsync();
【问题讨论】:
-
你可以试试
var rid = _context.UserRoles.Find(4)?.RoleId? -
尝试
FirstOrDefault而不是First。如果它不起作用,我将准备如何避免此类异常的示例。