簡體   English   中英

無法將Linq WHERE / IN / JOIN與Entity Framework一起使用

[英]Cant use Linq WHERE/IN/JOIN with Entity Framework on many to many

我可以在SQL中非常簡單地執行此操作,但是嘗試學習如何使用Entity Framework在Linq中執行此操作。

我有一個用戶,一個用戶可以有多個組,一個組可以有多個權限。

我想獲得用戶的所有權限。

我的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();
}

用這個

var linqQuery=(from p in Permission
                    join pg in PermissionGroup on p.Id equals pg.Id
                    join g in Group on pg.GroupId equals g.Id
                    join ug in UserGroup on g.Id equals ug.GroupId
                    where ug.UserId == USERID 
                    select p);

如果您有自己的DbContext類,其中所有數據庫表都表示為DbSets

public partial class OwnContext: DbContext
{
   public DbSet<User> Users { get; set; }
   public DbSet<Group> Groups { get; set; }
   public DbSet<Permission> Permissions { get; set; }
   public DbSet<UserGroup> UserGroups { get; set; }
   public DbSet<PermissionGroup> PermissionGroups { get; set; }
}

你必須用using語句創建一個類的實例,並在using語句執行查詢。

List<Permission> result;
using(OwnContext context = new OwnContext())
{
   result = (from permission in context.Permissions
             join permissionGroup in context.PermissionGroups on permission.Id equals permissionGroup.Id
             join group in context.Groups on permissionGroup.GroupId equals group.Id
             join userGroup in context.UserGroups on group.Id equals userGroup.GroupId
             where userGroup.UserId == user.Id 
             select permission).ToList();
}

加入SQL並不自動意味着您應該加入LINQ。 盡可能使用導航屬性。 如果這樣做,您的案例將變得更加簡單,並為此使用SelectMany

from u in db.Users
select new { 
             u.UserName,
             Permissions = u.Groups
                            .Select(ug => ug.Group)
                            .SelectMany(g => g.Permissions)
                            .Select(gp => gp.Permission
           }
using (var context = new NombreDeEntityDataModel)
{
    var query = from a in context.Permission
                join b in context.PermissionGroup on a.id equals b.PermissionId
                join c in context.Group on b.GroupId equals c.id
                join d in context.UserGroup on c.id equals d.GroupId
                where d.UserId = @UserId
                select a;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM