如何过滤实体框架中的多个相关实体

时间:2016-08-14 19:10:50

标签: c# .net entity-framework entity-framework-6

我有一个 - 也许有点尴尬 - 我无法找到答案的问题。我有以下实体:

public class Post
{
    public Guid Id { get; set; }
    public string Text { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

我使用流畅的API将关系配置为多对多:

modelBuilder.Entity<Post>()
    .HasMany(p => p.Tags)
    .WithMany()
    .Map(m =>
    {
        m.MapLeftKey("PostId");
        m.MapRightKey("TagId");
        m.ToTable("PostTags");
    });

我想按标签列表过滤帖子(只返回指定了所有标签的帖子):

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t)))

其中tags是用户指定标记的列表,而我的Tag实体的Equals方法被覆盖为基于Id属性。但是当我运行查询时,我得到NotSupportedException

  

类型&#39; System.NotSupportedException&#39;的例外情况发生在EntityFramework.SqlServer.dll中但未在用户代码中处理

     

其他信息:无法创建类型&#39; Plog.Domain.Plog.Tag&#39;的常量值。在此上下文中仅支持原始类型或枚举类型。

我怎样才能以合理的方式开展这项工作?

1 个答案:

答案 0 :(得分:1)

您似乎在尝试将标记用作查询中Tag的列表。 .Contains()不适用于类,因为它们不是常量。将tags转换为Guid列表(因为您正在检查Id)。即。

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t.Id)))

为了提高性能,您可以在表上放置索引。那是我的2美分。今天可能会有更好的方式,但上面对我来说已经很好了。