2013-02-18 56 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();