2016-08-14 48 views
1

我有一个 - 也许有点尴尬 - 问题,我无法找出答案。我有以下实体:如何在实体框架中由多个相关实体过滤

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

“System.NotSupportedException”类型的异常出现在EntityFramework.SqlServer.dll但在用户代码中没有处理

其他信息:无法创建类型为“Plog.Domain.Plog.Tag”的常量值。只有原始类型或枚举类型在此上下文中受支持。

我怎样才能使这项工作的方式也是合理的表现?

+0

我假设标签是一个'标签'列表?如果是这样,这就是问题 – Balah

回答

1

它看起来像你试图在你的查询中使用标签作为Tag的列表。 .Contains()将不能用于类,因为它们不是常量。将tags转换为Guid的列表(因为您正在查看Id)。即

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

对于性能,你可以把索引放在表上。这是我的2美分。今天可能会是更好的方式,但上述过去对我来说确实很好。

+0

谢谢,但不幸的是它不起作用,我得到了同样的异常(这是可以理解的,因为'Guid'不是一个原始类型)。 –

+0

好吧,这是令人惊讶的(我这样做就像那一天)。你可以用你如何定义'tags'来更新这个问题吗? – Balah

+0

我在单独的解决方案中隔离了问题,并且解决方案正常工作。这个例外与它完全无关。谢谢你的帮助! –

相关问题