C# 如何使用实体框架查询多对多关系

C# 如何使用实体框架查询多对多关系,c#,entity-framework,linq,C#,Entity Framework,Linq,我的应用程序中有以下型号: public class Employee { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Benefits { get; set; } } public class Department { public int DeptID {

我的应用程序中有以下型号:

public class Employee
{
    public int PersonId { get; set; }
    public string  FirstName { get; set; }
    public string LastName { get; set; }
    public int Benefits { get; set; }
}

public class Department
{
    public int DeptID { get; set; }
    public string DeptName { get; set; }
}

public class DeptEmp
{
    public int PersonID { get; set; }
    public int DeptID { get; set; }
}
我想使用实体框架创建一个查询,选择
employee
中的所有列,条件是只检索那些
PersonId
DeptEmp
类中的
DeptId
有关系的员工,并且
DeptEmp
中的
DeptId
DeptEmp
有关系

我已经写了以下LINQ声明:

var selectEmployees = from e in Employee
                      join d in DeptEmp on e.PersonId equals d.PersonId
                      join dd in Depatment on d.DeptId equals dd.DeptId
                      select new
                         {
                             e.FirstName,
                             e.LastName,
                             e.Benefits
                         };

但它不起作用。我遗漏了什么吗?

实体框架在“使用标准或其他”的基础上工作。如果你使用标准,这是相当容易的,如果不是,你必须提供大量关于你的偏差的信息

例如,实体框架需要一个主键Employee作为Id或EmployeeId。如果您决定使用不同的主键(PersonId),则必须告诉EntityFramework这是您的主键

你的多对多关系也是如此。如果您使用默认值,这是相当容易的,否则您将需要属性或fluentapi来通知与默认值的偏差

员工/部门模型中的默认多对多为:

另见


请定义“它不工作”。除非您告诉我们它当前在做什么以及应该做什么,否则我们无法解决此问题。谢谢,但它显示的记录比Employee表中的记录多。您尚未定义任何关系,即根中的集合,子中的父属性。如果有,子对象将通过导航属性可用。如果每个员工都有
部门
属性,则只需加载员工即可获得所有员工及其部门。如果您在
部门
上有一个
员工
集合,只需加载该部门即可获得单个部门的员工。在使用或不可能复制的感谢您的支持时,很少有任何好的理由使用JOIN。我在DeptEmp表中有一个status列,希望根据该列进行筛选。Hafizulla,这不是有点奇怪吗?我可以想象一个部门有一个状态,或者一个员工有一个状态。但是,您如何描述DeptEmp的状态?这意味着什么?你说得对,哈拉尔·科波尔斯,但这只是一个例子。我有一个更大的表,有很多列。但我需要帮助,了解如何根据DEPTEM中的列(而不是status之类的主键)过滤数据。
public class Employee
{
    public int EmployeeId{ get; set; }

    public string  FirstName { get; set; }
    public string LastName { get; set; }
    public int Benefits { get; set; }

    // an employee has many departments:
    public virtual ICollection<Department> Departments { get; set; }
}

public class Department
{
    public int DeptartmentId { get; set; }
    public string DeptName { get; set; }

    // an department has many employees
    public virtual ICollection<Employee> Employees{ get; set; }
}

public MyDbContext : DbContext
{
    public DbSet<Employee> Employees {get; set;}
    public DbSet<Department> Departments {get; set;}
}
using (var dbContext = new MyDbContext(...))
{
    var myDepartment = dbContext.Departments
        .Where(department => department.DepartmentId == DeptId)
        .SingleOrDefault();
    // I know there is at utmost one, because it is a primary key

    if (myDepartment == null) ShowDepartmentMissing(...);

    var employeesOfDepartment = myDepartment.Employees
        .Select(employee => new
        {
            FirstName = employee.FirstName,
            LastName = employee.LastName,
            Benefits = employee.Benefits,
        });