如何让 EF.core 使用 LEFT JOIN 而不是 INNER JOIN
How to get EF.core to use LEFT JOINs instead of INNER JOINs
我正在尝试将外键详细信息作为查询的一部分。
如何让 EF.core 使用 LEFT JOINs
而不是 INNER JOINs
?
public class Offence
{
[Key]
public Int32 offence_id { get; set; }
public Int32 guard_id { get; set; }
public Int32 penalty_id { get; set; }
public DateTime? dt_recorded { get; set; }
public Int32 salary_id { get; set; }
public Decimal? amount { get; set; }
public String status { get; set; }
public Int32 site_id { get; set; }
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
public DateTime? last_modified { get; set; }
public int? last_modified_by { get; set; }
}
在控制器中获取列表
var offences = db.Offences
.Include(e => e.Guard)
.Include(e => e.Penalty)
.Include(e => e.Site)
.Include(e => e.Salary)
.AsNoTracking();
生成 SQL:
SELECT [e].[offence_id], [e].[amount], [e].[dt_recorded], [e].[guard_id], [e].[last_modified], [e].[last_modified_by], [e].[penalty_id], [e].[salary_id], [e].[site_id], [e].[status], [e.Salary].[salary_id], [e.Salary].[dt_paid], [e.Salary].[guard_id], [e.Salary].[last_modified], [e.Salary].[last_modified_by], [e.Salary].[period], [e.Site].[site_id], [e.Site].[address], [e.Site].[client_id], [e.Site].[last_modified], [e.Site].[last_modified_by], [e.Site].[name], [e.Site].[state], [e.Penalty].[penalty_id], [e.Penalty].[amount], [e.Penalty].[description], [e.Penalty].[dt], [e.Penalty].[last_modified], [e.Penalty].[last_modified_by], [e.Penalty].[name], [e.Guard].[guard_id], [e.Guard].[address], [e.Guard].[bank], [e.Guard].[dob], [e.Guard].[dt_joined], [e.Guard].[dt_trained], [e.Guard].[has_picture], [e.Guard].[height], [e.Guard].[last_modified], [e.Guard].[last_modified_by], [e.Guard].[location_id], [e.Guard].[marital_status], [e.Guard].[mobiles], [e.Guard].[name], [e.Guard].[nuban], [e.Guard].[ref_no], [e.Guard].[religion], [e.Guard].[salary], [e.Guard].[sex], [e.Guard].[state_origin], [e.Guard].[status]
FROM [Offences] AS [e]
left JOIN [Salaries] AS [e.Salary] ON [e].[salary_id] = [e.Salary].[salary_id]
left JOIN [Sites] AS [e.Site] ON [e].[site_id] = [e.Site].[site_id]
left JOIN [Penalties] AS [e.Penalty] ON [e].[penalty_id] = [e.Penalty].[penalty_id]
left JOIN [Guards] AS [e.Guard] ON [e].[guard_id] = [e.Guard].[guard_id]
ORDER BY [e.Guard].[name]
找到解决方案,使所有外键都可以为空,然后 EF.core 使用 LEFT JOIN
代替查询:
public class Offence
{
[Key]
public Int32 offence_id { get; set; }
public Int32? guard_id { get; set; } // make null-able
public Int32? penalty_id { get; set; } // make null-able
public DateTime? dt_recorded { get; set; }
public Int32? salary_id { get; set; } // make null-able
public Decimal? amount { get; set; }
public String status { get; set; }
public Int32? site_id { get; set; } // make null-able
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
public DateTime? last_modified { get; set; }
public int? last_modified_by { get; set; }
}
我正在尝试将外键详细信息作为查询的一部分。
如何让 EF.core 使用 LEFT JOINs
而不是 INNER JOINs
?
public class Offence
{
[Key]
public Int32 offence_id { get; set; }
public Int32 guard_id { get; set; }
public Int32 penalty_id { get; set; }
public DateTime? dt_recorded { get; set; }
public Int32 salary_id { get; set; }
public Decimal? amount { get; set; }
public String status { get; set; }
public Int32 site_id { get; set; }
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
public DateTime? last_modified { get; set; }
public int? last_modified_by { get; set; }
}
在控制器中获取列表
var offences = db.Offences
.Include(e => e.Guard)
.Include(e => e.Penalty)
.Include(e => e.Site)
.Include(e => e.Salary)
.AsNoTracking();
生成 SQL:
SELECT [e].[offence_id], [e].[amount], [e].[dt_recorded], [e].[guard_id], [e].[last_modified], [e].[last_modified_by], [e].[penalty_id], [e].[salary_id], [e].[site_id], [e].[status], [e.Salary].[salary_id], [e.Salary].[dt_paid], [e.Salary].[guard_id], [e.Salary].[last_modified], [e.Salary].[last_modified_by], [e.Salary].[period], [e.Site].[site_id], [e.Site].[address], [e.Site].[client_id], [e.Site].[last_modified], [e.Site].[last_modified_by], [e.Site].[name], [e.Site].[state], [e.Penalty].[penalty_id], [e.Penalty].[amount], [e.Penalty].[description], [e.Penalty].[dt], [e.Penalty].[last_modified], [e.Penalty].[last_modified_by], [e.Penalty].[name], [e.Guard].[guard_id], [e.Guard].[address], [e.Guard].[bank], [e.Guard].[dob], [e.Guard].[dt_joined], [e.Guard].[dt_trained], [e.Guard].[has_picture], [e.Guard].[height], [e.Guard].[last_modified], [e.Guard].[last_modified_by], [e.Guard].[location_id], [e.Guard].[marital_status], [e.Guard].[mobiles], [e.Guard].[name], [e.Guard].[nuban], [e.Guard].[ref_no], [e.Guard].[religion], [e.Guard].[salary], [e.Guard].[sex], [e.Guard].[state_origin], [e.Guard].[status]
FROM [Offences] AS [e]
left JOIN [Salaries] AS [e.Salary] ON [e].[salary_id] = [e.Salary].[salary_id]
left JOIN [Sites] AS [e.Site] ON [e].[site_id] = [e.Site].[site_id]
left JOIN [Penalties] AS [e.Penalty] ON [e].[penalty_id] = [e.Penalty].[penalty_id]
left JOIN [Guards] AS [e.Guard] ON [e].[guard_id] = [e.Guard].[guard_id]
ORDER BY [e.Guard].[name]
找到解决方案,使所有外键都可以为空,然后 EF.core 使用 LEFT JOIN
代替查询:
public class Offence
{
[Key]
public Int32 offence_id { get; set; }
public Int32? guard_id { get; set; } // make null-able
public Int32? penalty_id { get; set; } // make null-able
public DateTime? dt_recorded { get; set; }
public Int32? salary_id { get; set; } // make null-able
public Decimal? amount { get; set; }
public String status { get; set; }
public Int32? site_id { get; set; } // make null-able
public Guard Guard { get; set; }
public Salary Salary { get; set; }
public Site Site { get; set; }
public Penalty Penalty { get; set; }
public DateTime? last_modified { get; set; }
public int? last_modified_by { get; set; }
}