实体框架-视图的右联接

本文关键字:视图 框架 实体 | 更新日期: 2023-09-27 18:26:41

我的数据库上下文中有两个实体:

员工
员工假期权利

认为这是一种相当正常的一对一关系,但员工可以在没有员工假期权利的情况下存在,但员工假期权利在没有员工的情况下不可能存在

员工被映射到我的数据库中的视图
EmployeeHolidayEntitment是一个

我的课程是:

员工假期权利

[Table("tblEmployeeHolidayEntitlement")]
public class EmployeeHolidayEntitlement
{
    [Key]
    public int EmployeeNumber { get; set; }
    public virtual Employee Employee { get; set; }
    public decimal StandardEntitlement { get; set; }
    //.....omitted for brevity
}

员工

[Table("vEmployee")] //note v - it's a view
public class Employee
{
    [Key]
    public int EmployeeNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在构建上下文时,我会:
(不确定这是否正确!)

modelBuilder.Entity<EmployeeHolidayEntitlement>()
  .HasRequired(w => w.Employee)
  .WithOptional();

在查询时,如果可能的话,我希望每个员工都有一条EmployeeEntitment记录(无论它是否存在于tblEmployeyHolidayEntitment中)-

我的查询当前如下:

from
    userEntitlement in db.ADUserHolidayEntitlement
 join
    adUser in db.ADUsers
    on
    userEntitlment.EmployeeNumber equals adUser.EmployeeNumber
select userEntitlement

但这(我认为)是在加入左翼-它只返回tblEmployeeHolidayEntitlement 中有条目的2个实体

我想得到的SQL需要看起来像:

SELECT 
employee.EmployeeNumber, 
employeeHol.* 
FROM tblEmployeeHolidayEntitlement employeeHol
RIGHT JOIN vEmployee employee
ON 
employeeHol.EmployeeNumber = employee.EmployeeNumber

这可能吗?

实体框架-视图的右联接

您的代码正在进行内部联接。我相信您要求检索所有员工,并为每个员工检索一个EmployeeHolidayEntitlement(如果存在的话)。

要执行左联接,请使用类似以下的查询:

from adUser in db.ADUsers
join userEntitlement in db.ADUserHolidayEntitlement on
    adUser.EmployeeNumber equals userEntitlment.EmployeeNumber into g
from userEntitlement in g.DefaultIfEmpty()
select new 
{
    adUser, 
    userEntitlement // Will be null of no entitlement exists
}

它按照您的要求进行内部联接。

您根本不需要显式联接。

你需要这样的东西:

from user in db.....
select new{user,user.Entitlement};