我有两个对象之间的多对多关系:
[Table("AEntities")]
public abstract class AEntity {
public int AEntityID { get; set; }
public string Description { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
和标签:
public class Tag {
public int TagID { get; set; }
public int AEntityID { get; set; }
public string TagValue { get; set; }
}
映射表:
public class AEntityTags {
public int AEntityTagID { get; set; }
public int TagID { get; set; }
public int AEntityID { get; set; }
}
流利的代码来定义映射:
modelBuilder.Entity<AEntity>()
.HasMany(t => t.Tags)
.WithMany(p=>p.AEntity)
.Map(t => t.MapLeftKey("AEntityID")
.MapRightKey("TagID")
.ToTable("AEntityTags"));
接下来,我试图获取给定集合的不同标签列表AEntities
。因此,如果我最后有三个AEntity
对象,我想要这三个实体中任何一个上的所有标签的列表。
我目前可以使用以下查询来完成此操作:
public IEnumerable<Tag> getTagsOnAEntities(IEnumerable<AEntities> aEntities) {
IEnumerable<Tag> results = _context.Tags
.AsEnumerable()
.Where(p => p.AEntities.Any(o=>aEntities.Contains(o)));
return results;
}
当使用这些时,我们将强制进行额外的查找以提取项目中使用的次数(即,我正在打印使用时的t.TagValue
和t.AEntities.Count()
)。
但正如预期的那样,随着 AEntities(几千个)和标签(千个映射的 10 个)数量的增长,速度非常慢(约 10 秒)。我了解效率低下的地方(数以千计的数据库调用),并且正在寻找有关方法的建议,因为我很难确定最佳方法应该是什么。我有以下困难:
如果我在数据库中使用标签的总次数之后我尝试单独查询
AEntityTags
表以获取计数TagID
(更快,因为它跳过加载任何内容,但仍然很慢) - 有没有比这更好的方法留在 EF ?有没有一种有效的方法来确定 a
Tag
在某个子集中使用的次数AEntities
?