事情是这样的,我有三张表,用户_角色关系表user_role,角色_菜单关系表role_menu和菜单表
menu,这三个表之间有如下关系:
user_role=>roleid=>rolemenu
rolemenu=>menuid=>menu
它们之间的业务关系是:
当用户登陆后,通过userid得到user_role列表,将用户所包括的角色得出
通过user_role找到所有对应menu
现在有个问题,就是一个用户可以有多少角色,一个角色有多个菜单,当然,两个不同的角色可以有相当的菜单项,这时,就出现一个问题,用户在“管理员”这个角色里有“文件”这个菜单,同时它在“新闻管理员”这个角色里也有“文件”这个菜单,这样返回就会出现两个完成相同的”文件“菜单,下面,我使用匿名类和distinct方法来解决这个问题,代码如下:
代码如下:
class program
{
static void main(string[] args)
{
#region 实体列表初始化
list userrole = new list
{
new user_role(01,1),
new user_role(01,2),
new user_role(02,1),
};
list rolemenu = new list
{
new role_menu(2,3),
new role_menu(1,1),
new role_menu(1,2),
new role_menu(2,1),
new role_menu(2,2),
};
list menu = new list
{
new menu(1,编辑,2),
new menu(2,文件,1),
new menu(3,视图,3),
new menu(4,系统,4),
};
#endregion
var linq = from data1 in userrole
join data2 in rolemenu on data1.roleid equals data2.roleid
join data3 in menu on data2.menuid equals data3.menuid
where data1.userid.equals(01)
select new
{
userid = data1.userid,
menuid = data2.menuid,
menu = data3,
};
linq.distinct().orderby(i => i.menu.ordernumber).tolist()
.foreach(i => console.writeline(用户id:{0},菜单id{1},菜单名:{2}
, i.userid, i.menuid, i.menu.menuname));
console.readkey();
}
}
#region 实体对象
class user_role
{
public string userid { get; set; }
public int roleid { get; set; }
public user_role(string userid, int roleid)
{
this.roleid = roleid;
this.userid = userid;
}
}
class menu
{
public int menuid { get; set; }
public string menuname { get; set; }
public int ordernumber { get; set; }
public menu(int menuid, string menuname, int ordernumber)
{
this.menuid = menuid;
this.menuname = menuname;
this.ordernumber = ordernumber;
}
}
class role_menu
{
public int roleid { get; set; }
public int menuid { get; set; }
public role_menu(int roleid, int menuid)
{
this.roleid = roleid;
this.menuid = menuid;
}
}
#endregion
这样的结果是我希望看到的: