C# 在导航属性上使用Where子句。多对多关系

C# 在导航属性上使用Where子句。多对多关系,c#,linq,asp.net-core,entity-framework-core,asp.net-core-2.1,C#,Linq,Asp.net Core,Entity Framework Core,Asp.net Core 2.1,我一直在看其他的例子,所以我仍然无法解决这个问题 我有以下模型结构 public class Event { [Key] public int ID { get; set; } public ICollection<EventCategory> EventCategories{ get; set; } } public class Category { [Key] publi

我一直在看其他的例子,所以我仍然无法解决这个问题

我有以下模型结构

 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; }
    }
这就是我得到的错误


TIA

首先,传递给
Include
的lambda必须是一个模型表达式。具体来说,这意味着您不能使用类似于
Select
的内容。如果您试图包括
EventCategories.Category
,那么您实际上应该:

.Include(e => e.EventCategories).ThenInclude(ms => ms.Category)
这将修复您的即时错误。下一个问题是,您试图查询类别ID的方式不正确。LAMDA不会从一个条款延续到下一个条款。换句话说,当您执行
时,其中(e=>e.ID==1)
e
事件
,而不是
类别
。您刚才包含的
Category
并没有将where子句限制在该上下文中。因此,您实际需要的是:

.Where(e => e.EventCategories.Any(c => c.CategoryID == 1))
无论如何,你也可以这样写:

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

注意
类别
ID
之间的
。现在,where子句要求在所有
Event
EventCategories
categories
之间进行连接,这意味着您实际上不需要您的
Include(…)。然后Include(…)
语句,因为这只是告诉EF进行它已经进行的相同连接。我仍然会显式地执行include,不过,与其他方式一样,如果您的where子句在将来的某个迭代中发生更改,那么您可能不再隐式地包含您实际希望包含的所有内容。首先,传递给Include的lambda必须是一个模型表达式。具体来说,这意味着您不能使用类似于
Select
的内容。如果您试图包括
EventCategories.Category
,那么您实际上应该:

.Include(e => e.EventCategories).ThenInclude(ms => ms.Category)
这将修复您的即时错误。下一个问题是,您试图查询类别ID的方式不正确。LAMDA不会从一个条款延续到下一个条款。换句话说,当您执行
时,其中(e=>e.ID==1)
e
事件
,而不是
类别
。您刚才包含的
Category
并没有将where子句限制在该上下文中。因此,您实际需要的是:

.Where(e => e.EventCategories.Any(c => c.CategoryID == 1))
无论如何,你也可以这样写:

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

注意
类别
ID
之间的
。现在,where子句要求在所有
Event
EventCategories
categories
之间进行连接,这意味着您实际上不需要您的
Include(…)。然后Include(…)
语句,因为这只是告诉EF进行它已经进行的相同连接。我仍然会显式地执行include,不过,与其他方式一样,如果您的where子句在将来的某个迭代中发生更改,那么您可能不再隐式地包含您实际希望包含的所有内容。仅供思考。

您能分享您的LINQ查询和错误吗?您的ICollections是否有名称?抱歉,我错误地键入了类。我已经更新了我的问题。你能分享你的LINQ查询和错误吗?你的ICollections有名字吗?对不起,我错误地输入了类。我已经更新了我的问题谢谢你的回答和深入的解释。工作完美谢谢你的回答和深入的解释。完美地工作