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