如何在实体框架中使用LINQ返回此结果(2个外键映射表)



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

最新更新