i有一个表,其中包含2个外键,该键分别引用2个不同的表。我想退还所有具有"科学"课程的人的结果。
如何使用linq回收记录?这就是我到目前为止得到的:
return
_ctx.Person
.Include(u => u.Course
.Where(ug=>ug.CourseName== "Science"));
这不起作用,因为它显示了错误。
包括路径表达式必须参考导航属性 在类型上定义
public class Course
{
public int CourseID {get; set;}
public string CourseName {get; set;}
public virtual ICollection<Person> Persons { get; set; }
}
public class Person
{
public int PersonID {get; set;}
public virtual ICollection<Course> Courses { get; set; }
}
这是映射表。仅包含2个不同表的2个外键。我无法在解决方案内使用此表。由于代码不包含其自己的PK。
//This is not shown in the EntityFramework when generating Code First.
public class PersonCouseMap
{
public int PersonID {get; set;}
public int CourseID {get; set;}
}
更新:我切换实体后起作用。
return _ctx.Course
.Include(u=>u.Person)
.Where(ug=>ug.CourseName == "Sciene");
任何人都可以解释为什么它不会再解决。我需要显示一个有"科学"课程的人的清单,不是有用户列表的课程科学。
原始查询不起作用,因为您已经在Include
表达式中推了Where
谓词,该谓词不受例外消息所示的支持。
Include
方法是用于急切相关数据的EF特定扩展方法。它与查询过滤无关。
要应用具有"科学"课程的所需过滤器您需要基于Any
的谓词,因为Person.Courses
是一个集合:
return _ctx.Person
.Where(p => p.Courses.Any(c => c.CourseName == "Science"));
要将相关数据包括在结果中,将其与Include
调用结合在一起:
return _ctx.Person
.Include(p => p.Courses)
.Where(p => p.Courses.Any(c => c.CourseName == "Science"));
看起来这两个entites之间没有关系,您可以通过对代码进行以下更改来建立关系:
在这里,我假设您想通过拥有第三个实体 personcoursemap
来建立这两个表之间的多对多关系public class Course
{
public int CourseID {get; set;}
public string CourseName {get; set;}
public virtual ICollection<CoursePersons> Courses { get; set; }
}
public class Person
{
public int PersonID {get; set;}
public virtual ICollection<PersonCourse> Courses { get; set; }
}
public class PersonCourseMap
{
public int PersonID {get; set;}
public int CourseID {get; set;}
public virtual ICollection<Person> Persons { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
进行上述更改后,您可以简单地浏览属性。
包括外键映射
public class Course
{
public int CourseID {get; set;}
public string CourseName {get; set;}
public virtual ICollection<Person> Person {get; set}
}
public class Person
{
public int PersonID {get; set;}
public virtual ICollection<Course> Course {get; set;}
}
using System.ComponentModel.DataAnnotation.Schema;
public class PersonCouseMap
{
[ForeignKey("Person")]
public int PersonID {get; set;}
[ForeignKey("Course")]
public int CourseID {get; set;}
public virtual ICollection<Person> Person {get; set;}
public virtual ICollection<Course> Course {get; set;}
}