Если у вас есть свойства навигации для всех ваших ключей и внешних ключей, альтернативный запрос без Intersect
будет выглядеть так:
var query = context.XDocuments
.Where(d => d.Groups.Any(g => g.Users.Any(u => u.UserID == givenUserId)));
("Фильтровать все документы, которые находятся в как минимум * 1006"* одна группа, в которой есть как минимум один пользователь с ключом = givenUserId
")
Я не знаю, будет ли это лучше по производительности.
В EF 4.1 вы можете проверить сгенерированный SQL просто:
var sql = query.ToString();
Редактировать
Мое понимание того, как будет выглядеть ваша модель, заключается в следующем:
Три сущности с соответствующими таблицами:
public class User
{
public int UserID { get; set; }
public ICollection<Group> Groups { get; set; }
}
public class Group
{
public int GroupID { get; set; }
public ICollection<User> Users { get; set; }
public ICollection<XDocument> Documents { get; set; }
}
public class XDocument
{
public int DocumentID { get; set; }
public ICollection<Group> Groups { get; set; }
}
И между User
и Group
отношение многих ко многим, а также между Group
и XDocument
:
modelBuilder.Entity<User>()
.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<XDocument>()
.HasMany(d => d.Groups)
.WithMany(g => g.Documents)
.Map(c =>
{
c.MapLeftKey("DocumentID");
c.MapRightKey("GroupID");
c.ToTable("XDocumentSecurity"); // join table name, no entity
});
В этой модели и отображении запрос, описанный выше, должен быть возможен.Нет необходимости напрямую обращаться к объединяемым таблицам (и вы на самом деле не можете получить к ним доступ через LINQ to Entities, EF управляет этими таблицами внутри).