日期:2014-05-20  浏览次数:20835 次

EntityFramework代码优先模式里面的多对多查询
菜单类
    public class BaseMenu 
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "名称")]
        [Required(ErrorMessage = "不能为空!")]
        [MaxLength(50, ErrorMessage = "长度不能超过50个字符!")]
        public string Name { get; set; }

         public virtual ICollection<BaseRole> Roles { get; set; }
   }

角色类
    public class BaseRole
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "名称")]
        [Required(ErrorMessage = "不能为空!")]
        [MaxLength(50, ErrorMessage = "长度不能超过50个字符!")]
        public string Name { get; set; }

        public virtual ICollection<BaseUser> Users { get; set; }

        public virtual ICollection<BaseMenu> Menus { get; set; }
    }

用户类
 public class BaseUser
    {
        [Key]
        public int Id { get; set; }


        [Display(Name = "用户名")]
        [Required(ErrorMessage = "用户名不能为空!")]
        [MaxLength(50, ErrorMessage = "长度不能超过50个字符!")]
        public string UserName { get; set; }

        public virtual ICollection<BaseRole> Roles { get; set; }
     }


请问一下,我需要怎么根据用户Id来获取用户所属的角色下面的菜单呢?
用户与角色是多对多关系,菜单对角色是多对多关系。
请各位帮下忙,纠结好久了。
EntityFramework 代码优先 多对多查询

------解决方案--------------------
var roleIds= user.Roles.Select(r=>r.Id);

var menus = menu.Where(m=>m.Roles.Any(r=>roleIds.Contains(r.Id)));
------解决方案--------------------

var query=from bm in db.BaseMenus
          join brm in db.BaseRoleMenu on bm.Id equals brm.MenuId
          join br in db.BaseRole on brm.RoleId equals br.Id
          join bur in db.BaseUserRoles on br.Id equals bur.RoleId
          join bu in db.BaseUsers on bur.UserId equals bu.Id
          where bu.Id==206
          select bm;