合并的多个集合来挂很多实体
问题描述:
我有一个多对多的关系,两个物体之间:合并的多个集合来挂很多实体
[Table("AEntities")]
public abstract class AEntity {
public int AEntityID { get; set; }
public string Description { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
和TAG:
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内?有没有一种有效的方法来确定在
AEntities
的某个子集中使用Tag
的次数?
答
我没有类似于数据库得心应手一些测试,但你可能想在你的查询尝试一下本作的表现:
IEnumerable<Tag> results = aEntities.SelectMany(e=>e.Tags).Distinct();
@ManosDilaverakis谢谢你,这是更好的然后我是什么这样做。我知道这很简单,我忽略了。同样的结果是,最大的低效率是仍然基于以前的数据模型的一大块代码,它足够的功能不会失败,但运行速度非常慢。发布它作为答案,我会接受。 – Matthew 2013-02-19 15:22:29