我有两个列表
user.Roles
repository.Roles
和RoleViewModel
public class RoleViewModel
{
public int RoleID { get; set; }
public bool InRole { get; set; }
public string Name { get; set; }
public RoleViewModel() { }
public RoleViewModel(Role role,bool inRole)
{
this.RoleID = role.RoleID;
this.Name = role.Name;
this.InRole = inRole;
}
}
我需要生成像List<RoleViewModel>
这样的任何集合,它将是一个RoleRode字段设置为true的RoleViewModel项的组合。以及放置在repository.Roles集合中的所有其他可能的角色,将转换为RoleViewModels。
我可以使用linq生成所需的列表吗?
谢谢
答案 0 :(得分:2)
是的,你可以,你只需要修复你的linq来调用构造函数而不是为(不存在的)属性赋值。
List<RoleViewModel> models = (from r1 in repository.Roles
join r2 in user.Roles on r1.RoleID equals r2.RoleID
select new RoleViewModel(r1, true)).ToList();
答案 1 :(得分:2)
您似乎想要存储库中每个角色的视图模型,如果用户在该角色中,则inRole
参数为true。如果我错了,请纠正我。
为此,您需要从存储库角色到用户角色的左连接:
from role in repository.Roles
join userRole in user.Roles on role.RoleID equals userRole.RoleID into userRoles
from userRole in userRoles.DefaultIfEmpty()
select new RoleViewModel(role, userRole != null)
这会将存储库中的角色集合加入到用户的角色集中。它将匹配的用户角色放入userRoles
序列,如果用户不在存储库角色中,则使用DefaultIfEmpty
为userRole
返回null。这样,如果userRole
不为null,则用户处于存储库角色,但如果userRole
为null,则该用户不在存储库角色中。