2013-02-18 173 views
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.TagValuet.AEntities.Count()當使用時)。

但是,隨着AEntities(數千個)和標籤(10萬個映射的數量)的增長,可能會預期會非常慢(〜10秒)。我瞭解效率低下的原因(數千個數據庫調用),並且正在尋找有關方法的建議,因爲我很難確定最佳方法應該是什麼。我有以下困難:

  1. 如果我是一個標籤,在我已分別嘗試查詢AEntityTags表爲TagID的計數(更快的數據庫使用次數總體計數之後,它跳過加載什麼,但仍然很慢) - 有沒有更好的方法比這停留在EF內?

  2. 有沒有一種有效的方法來確定在AEntities的某個子集中使用Tag的次數?

+0

@ManosDilaverakis謝謝你,這是更好的然後我是什麼這樣做。我知道這很簡單,我忽略了。同樣的結果是,最大的低效率是仍然基於以前的數據模型的一大塊代碼,它足夠的功能不會失敗,但運行速度非常慢。發佈它作爲答案,我會接受。 – Matthew 2013-02-19 15:22:29

回答

1

我沒有類似於數據庫得心應手一些測試,但你可能想在你的查詢嘗試一下本作的表現:

IEnumerable<Tag> results = aEntities.SelectMany(e=>e.Tags).Distinct();