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
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).