通过LINQ生成视图模型

时间:2011-11-28 17:59:29

标签: c# .net linq entity-framework

我有两个列表

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生成所需的列表吗?

谢谢

2 个答案:

答案 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序列,如果用户不在存储库角色中,则使用DefaultIfEmptyuserRole返回null。这样,如果userRole不为null,则用户处于存储库角色,但如果userRole为null,则该用户不在存储库角色中。