【发布时间】:2014-11-20 10:58:11
【问题描述】:
我可以在 SQL 中非常简单地做到这一点,但尝试学习如何在 Linq 中使用 Entity Framework 做到这一点。
我有一个用户,一个用户可以有多个组,一个组可以有多个权限。
我想获得一个用户的所有权限。
我的 DbContext 中有以下 DbSet
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<Permission> Permissions { get; set; }
还有类是这样的
public class User : Entity, IUser<long>
{
public string UserName { get; set; }
public string PasswordHash { get; set; }
public User()
: base()
{
this.Groups = new HashSet<UserGroup>();
}
public virtual ICollection<UserGroup> Groups { get; set; }
}
public class Group : AuditableEntity
{
public Group() {
this.Permissions = new HashSet<GroupPermission>();
}
public string Name { get; set; }
public virtual ICollection<GroupPermission> Permissions { get; set; }
}
public class Permission
{
public string Name { get; set; }
public Permission()
{
}
}
为了处理多对多的关系,我也有这些类
public class UserGroup
{
public long UserId { get; set; }
public long GroupId { get; set; }
public virtual User User { get; set; }
public virtual Group Group { get; set; }
}
public class GroupPermission
{
public long PermissionId { get; set; }
public long GroupId { get; set; }
public virtual Permission Permission { get; set; }
public virtual Group Group { get; set; }
}
现在在 SQL 中我会简单地做
SELECT Permission.*
FROM Permission
INNER JOIN PermissionGroup ON Permission.Id = PermissionGroup.PermissionId
INNER JOIN Group ON PermissionGroup.GroupId = Group.Id
INNER JOIN UserGroup ON Group.Id = UserGroup.GroupId
WHERE UserGroup.UserId = @UserId
有人可以告诉我为什么我不能在 LINQ 中这样做吗?好吧,我知道我可以,但我不知道怎么做。
编辑
context.PermissionGroup 和 context.UserGroup 在我的上下文中不是 DbSet。
List<Permission> result;
using(DataContext context = new DataContext())
{
result = (from permission in context.Permissions
join permissionGroup in context.PermissionGroup on permission.Id equals permissionGroup.Id
join g in context.Groups on permissionGroup.GroupId equals g.Id
join userGroup in context.UserGroup on g.Id equals userGroup.GroupId
where userGroup.UserId == user.Id
select permission).ToList();
}
【问题讨论】:
标签: c# asp.net .net linq entity-framework