合并多个到多个链接实体的集合

时间:2013-02-18 23:14:07

标签: c# entity-framework linq-to-entities

我有两个对象之间的多对多关系:

[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.TagValuet.AEntities.Count())。

但是,随着AEntities(数千个)和标签(千万个映射中的10个)的增长,可能预期会非常缓慢(~10秒)。我理解效率低下的地方(成千上万的数据库调用),并且正在寻找方法方面的建议,因为我很难确定最佳方法应该是什么。我遇到以下困难:

  1. 如果我在数据库中使用标记的总次数之后,我尝试单独查询AEntityTags表以获取TagID的计数(更快,因为它跳过加载任何内容,但仍然很慢) - 有没有比在EF中更好的方式?

  2. 是否有一种有效的方法来确定在Tag的某个子集中使用AEntities的次数?

1 个答案:

答案 0 :(得分:1)

我没有类似于您的数据库的方便测试,但您可能想尝试这个以提高查询的性能:

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