0

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

[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; }
}

流利的代码来定义映射:

        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. 有没有一种有效的方法来确定 aTag在某个子集中使用的次数AEntities

4

1 回答 1

1

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

IEnumerable<Tag> results = aEntities.SelectMany(e=>e.Tags).Distinct(); 
于 2013-02-21T22:27:19.717 回答