【问题标题】:How to filter by multiple related entities in Entity Framework如何在实体框架中按多个相关实体进行过滤
【发布时间】:2016-08-14 19:10:49
【问题描述】:

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

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

我使用 fluent 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 的列表?如果是这样,那就是问题

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


【解决方案1】:

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

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

为了提高性能,您可以在表上放置索引。那是我的 2 美分。今天可能是更好的方法,但上述方法过去对我来说还可以。

【讨论】:

  • 谢谢,但不幸的是它不起作用,我得到了同样的异常(这是可以理解的,因为Guid 不是原始类型)。
  • 好吧,这很令人惊讶(前几天我也是这样做的)。你能用你如何定义tags来更新这个问题吗?
  • 我将问题隔离在单独的解决方案中,并且您的解决方案有效。异常与它完全无关。感谢您的帮助!
猜你喜欢
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2017-11-08
  • 1970-01-01
  • 2012-01-15
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多