我有一个-也许有点尴尬的问题-我想不出答案。我有以下实体:
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
:
EntityFramework.SqlServer.dll中发生类型为'System.NotSupportedException'的异常,但未在用户代码中处理
附加信息:无法创建类型为'Plog.Domain.Plog.Tag'的常量值。在此上下文中仅支持原始类型或枚举类型。
如何以合理的方式进行这项工作?
您似乎在尝试将标签用作Tag
查询中的列表。.Contains()
因为它们不是常量,所以不能与类一起使用。转换tags
为的列表Guid
(因为您正在选中Id
)。IE
context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t.Id)))
为了提高性能,您可以在表上放置索引。那是我的2美分。也许今天是更好的方法,但是以上内容对我而言过去是可以的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句