我有3张桌子:
-Users (UserId(pk), Email, Password)
-Roles (RoleId(pk), RoleDescription)
-UsersInRole (UserId(pk), RoleId(pk))
我在DB中定义了Users-> UsersInRole和Roles-> UsersInRole之间的关系。当我在Visual Studio中创建edmx文件时,它只显示两个类:用户和角色通过多对多关系连接(UsersInRole表未显示为我猜的类,因为该表可以将多个表分解为许多数据库问题)。
现在,我正在尝试定义一个给出角色的方法,它应该返回一个用户列表。这不起作用:
public List<User> usersPerRole(string role)
{
return from u in entities.Roles where u.RoleID == role select u.Users.ToList();
}
那里的任何人都可以给我一个正确方法的例子吗?
谢谢,
答案 0 :(得分:1)
你需要这样的东西(我希望你在Users
实体上有Role
导航属性):
public List<User> UsersPerRole(string role)
{
return entities.Roles
.Where(r => r.RoleId == role)
.SelectMany(r => r.Users)
.ToList();
}
你可以在没有lambdas的情况下重写它:
public List<User> UsersPerRole(string role)
{
return (from r in entities.Roles
from u in r.Users
where r.RoleId == role
select u).ToList();
}
答案 1 :(得分:1)
耦合表“UsersInRole”(除了一起构成表的主键的两个外键之外)将被转换为foreighn键“两侧”的导航属性。所以在用户和角色实体中。在用户中,它将是User.RolesForThisUser,在角色中它将是Role.UsersWithThisRole。在耦合表中添加任何互补列将导致该表的特定实体,并且如所解释的那样丢失导航属性。
现在你的问题可以简单地做:
public List<User> usersPerRole(string role)
{
using(Entities context is new Entities())
{
return context.Role.FirstOrDefault<Role>(r => r.ID == role).Include("UsersInRole")
}
}