【问题标题】:Use Where Clause on navigation property. Many-to-many relationship在导航属性上使用 Where 子句。多对多关系
【发布时间】:2018-08-22 17:19:35
【问题描述】:

我一直在查看有关 SO 的其他示例,但仍然无法解决此问题。

我有以下模型结构

 public class Event
    {
        [Key]
        public int ID { get; set; }
        public ICollection<EventCategory> EventCategories{ get; set; }
    }

 public class Category
    {
        [Key]
        public int ID { get; set; }
        public ICollection<EventCategory> EventCategories{ get; set; }
    }

 public class EventCategory
    {
        [Key]
        public int ID { get; set; }
        public int EventID{ get; set; }
        public Event Event{ get; set; }
        public int CategoryID{ get; set; }
        public Category Category{ get; set; }
    }

在我的事件控制器中,我尝试使用 LINQ 查询仅显示 CategoryID 等于 1 的事件,但我认为我的 WHERE 子句不断出现错误。

更新:

我一直在尝试多个查询,但目前是

    var eventsContext = _context.Events
            .Include(e => e.EventCategories)
            .Include(e=>e.EventCategories.Select(ms => ms.Category))
            .Where(e=>e.ID==1)
            .Take(15)
            .OrderByDescending(o => o.StartDate);

这是我得到的错误

TIA

【问题讨论】:

  • 您能分享您的 LINQ 查询和错误吗?
  • 你的 ICollections 有名字吗?
  • 对不起,我错误地输入了错误的类。我已经更新了我的问题

标签: c# linq asp.net-core entity-framework-core asp.net-core-2.1


【解决方案1】:

首先,传递给Include 的 lambda 必须是模型表达式。具体来说,这意味着您不能使用Select 之类的东西。如果您尝试包含EventCategories.Category,那么您实际上应该这样做:

.Include(e => e.EventCategories).ThenInclude(ms => ms.Category)

这将解决您的直接错误。下一个问题是您尝试查询类别 ID 的方式不正确。 lamdas 不会从一个子句延续到下一个子句。换句话说,当你在做Where(e =&gt; e.ID == 1)时,eEvent,而不是Category。您刚刚包含 Category 的事实并没有将 where 子句限制在该上下文中。因此,您真正需要的是:

.Where(e => e.EventCategories.Any(c => c.CategoryID == 1))

对于它的价值,你也可以这样写:

.Where(e => e.EventCategories.Any(c => c.Category.ID == 1))

注意CategoryID 之间的.。现在这个 where 子句要求在所有 EventEventCategories Category 之间进行连接,这意味着你实际上不需要你的 Include(...).ThenInclude(...) 语句,因为所有这些确实是告诉 EF 进行它已经进行的相同 JOIN。不过,我通常仍会明确地执行包含,否则,如果您的 where 子句在将来的某个迭代中发生更改,您最终可能不再隐含地包含您实际想要包含的所有内容。值得深思。

【讨论】:

  • 感谢您的回答和深入的解释。完美运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2013-05-19
  • 2022-12-07
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多