How do I use Linq and Entity Framework to join two jointables?

前端 未结 2 571
情歌与酒
情歌与酒 2021-01-22 21:11

I have a very normalized database, and I\'m trying to join two join tables together.

My goal is to only show documents that the user has permission to. I\'m using Ent

2条回答
  •  旧时难觅i
    2021-01-22 21:26

    If you have navigation properties for all your keys and foreign keys an alternative query without an Intersect would be:

    var query = context.XDocuments
        .Where(d => d.Groups.Any(g => g.Users.Any(u => u.UserID == givenUserId)));
    

    ("Filter all documents which are in at least one group which has at least one user with the key = givenUserId")

    I don't know if this will be better with respect to performance.

    In EF 4.1 you can inspect the generated SQL simply by:

    var sql = query.ToString();
    

    Edit

    My understanding how your model would look is the following:

    Three entities with corresponding tables:

    public class User
    {
        public int UserID { get; set; }
        public ICollection Groups { get; set; }
    }
    
    public class Group
    {
        public int GroupID { get; set; }
        public ICollection Users { get; set; }
        public ICollection Documents { get; set; }
    }
    
    public class XDocument
    {
        public int DocumentID { get; set; }
        public ICollection Groups { get; set; }
    }
    

    And between User and Group a many-to-many relationship and between Group and XDocument as well:

    modelBuilder.Entity()
        .HasMany(u => u.Groups)
        .WithMany(g => g.Users)
        .Map(c =>
        {
            c.MapLeftKey("UserID");
            c.MapRightKey("GroupID");
            c.ToTable("UserGroupMembership");  // join table name, no entity
        });
    
    modelBuilder.Entity()
        .HasMany(d => d.Groups)
        .WithMany(g => g.Documents)
        .Map(c =>
        {
            c.MapLeftKey("DocumentID");
            c.MapRightKey("GroupID");
            c.ToTable("XDocumentSecurity");  // join table name, no entity
        });
    

    In this model and mapping the query described above should be possible. There is no need to access the join tables directly (and you can't actually access them via LINQ to Entities, EF manages those tables internally).

提交回复
热议问题