0
我有一個多對多的關係,兩個物體之間:合併的多個集合來掛很多實體
[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
的次數?
@ManosDilaverakis謝謝你,這是更好的然後我是什麼這樣做。我知道這很簡單,我忽略了。同樣的結果是,最大的低效率是仍然基於以前的數據模型的一大塊代碼,它足夠的功能不會失敗,但運行速度非常慢。發佈它作爲答案,我會接受。 – Matthew 2013-02-19 15:22:29