【问题标题】:How Include / ThenInclude in EF Core 3.1 Will Be transformed as Inner JoinEF Core 3.1 中的 Include / ThenInclude 将如何转换为 Inner Join
【发布时间】:2020-02-10 15:47:43
【问题描述】:

我使用的是 EF Core 3.1。我希望 Include() 和 ThenInclude 产生 Inner join 但他们正在生产 LEFT join 。 我正在使用代码优先方法。 以下是我的示例模型

public class Employee
    {
        [Key]
        public int Id { get; set; }

        public string Name { get; set; }

        public string Gender { get; set; }

        public string Img1 { get; set; }

        public virtual EmployeeDepartment EmployeeDepartment { get; set; }
    }

And
    public class EmployeeDepartment
    {       
        public int DeptID { get; set; }

        [ForeignKey("Employee")]
        [Required]
        public int Id { get; set; }

        public string DeptName { get; set; }

        public virtual Employee Employee { get; set; }
    }

下面是 linq 查询

var result= context.Employees.Include(dept => dept.EmployeeDepartment).ToList();

在 O/P 窗口中产生下面的 Sql 查询

SELECT [dept].[Id], [dept].[Gender], [dept].[Img1], [dept].[Name], [dept.EmployeeDepartment].[Id], [dept.EmployeeDepartment].[DeptID], [dept.EmployeeDepartment].[DeptName]
FROM [Employees] AS [dept]
**LEFT JOIN** [EmployeeDepartment] AS [dept.EmployeeDepartment] ON [dept].[Id] = [dept.EmployeeDepartment].[Id]

我想制作内部连接。欢迎提出任何建议。

【问题讨论】:

  • [Required] 属性添加到EmployeeDepartment
  • 我已经尝试过了,但没有帮助。
  • 这个thread已经解释清楚了,目前获得内部连接的唯一方法(当然除了手动连接)是从关系的另一端导航。

标签: .net asp.net-core asp.net-core-3.1 ef-core-3.1


【解决方案1】:

您可以尝试恢复查询的顺序(例如子 -> 父):

var result= _context.EmployeeDepartments.Include(dept => dept.Employee).ToList();

但是,这会增加额外的心理负担,并且可能不是您想要的。如果您的域模型中需要您的关系,我建议您坚持使用您的查询,它不应该影响性能,因为在这种情况下左连接和内连接会产生相同的结果。

PS:对于 EmployeeDepartment 类,您将 Id 配置为主键(按照惯例)和外键(带有数据注释)。未使用 DeptID 属性(我猜想它是 PK)。

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2020-08-24
    • 2021-04-21
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多