我有两个对象之间的多对多关系:
[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; }
}
Fluent Code定义映射:
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中更好的方式?
是否有一种有效的方法来确定在Tag
的某个子集中使用AEntities
的次数?
答案 0 :(得分:1)
我没有类似于您的数据库的方便测试,但您可能想尝试这个以提高查询的性能:
IEnumerable<Tag> results = aEntities.SelectMany(e=>e.Tags).Distinct();