我有一个 - 也许有点尴尬 - 我无法找到答案的问题。我有以下实体:
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;的常量值。在此上下文中仅支持原始类型或枚举类型。
我怎样才能以合理的方式开展这项工作?
答案 0 :(得分:1)
您似乎在尝试将标记用作查询中Tag
的列表。 .Contains()
不适用于类,因为它们不是常量。将tags
转换为Guid
列表(因为您正在检查Id
)。即。
context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t.Id)))
为了提高性能,您可以在表上放置索引。那是我的2美分。今天可能会有更好的方式,但上面对我来说已经很好了。