EF Core Include() 不执行 LEFT JOIN

问题描述 投票:0回答:1

我遇到的问题是:我需要获取多个导航属性才能在前端显示数据。我正在使用 .Include() 来获取这些。默认情况下, Include 会进行内部联接,我明白了。我还读到,如果导航属性可以为空并且数据库中的列类型可以为空,那么它将执行 LEFT JOIN 。我的查询仍然使用 INNER JOIN ,即使我的两个 FK 列都可以为空。

这是我的询问

var listOfProductsOnSets = await productWithSetsRepository
            .FindQueryable(asoc => asoc.IdSet == idSet)
            .Include(c => c.AsCuloare)
                .ThenInclude(cc => cc!.CodCuloare)
            .Include(d => d.AsDimensiune)
            .AsSplitQuery()
            .ToListAsync();

这是我的课:

public class AsociereSeturi
{
    // Attributes
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdAsociereSet { get; init; }
    
    // Foreign Keys
    public int IdProdus { get; init; }
    public  Produse Produs { get; init; } = null!;
    
    public int IdSet { get; init; }
    public  Seturi Set { get; init; } = null!;
    
    public int? IdCuloare { get; init; }
    public Culori? AsCuloare { get; init; } 
    public int? IdDimensiune { get; init; }
    public Dimensiuni? AsDimensiune { get; init; } 
    
    public ICollection<ProduseCuComenzi> CombinatieSetPeComanda { get; } 



}

这些是我的日志:

SELECT a.id_asociere_set, a.id_culoare, a.id_dimensiune, a.id_produs, a.id_set, 
       c.id_culoare, c.id_cod_culoare, c.nume_culoare, 
       d.id_dimensiune, d.latime, d.lungime, d.PerdeaEstePereche, d.recomandare_pat
FROM asociere_seturi AS a
INNER JOIN culori AS c ON a.id_culoare = c.id_culoare
INNER JOIN dimensiuni AS d ON a.id_dimensiune = d.id_dimensiune
WHERE a.id_set = @__idSet_0;

c# entity-framework entity-framework-core
1个回答
0
投票

您可以添加用于解析关系和 FK 的配置吗?

按照惯例,EF 不会解析“IdCuloare”,或者肯定不会将“id_culoare”解析为类型为

Culoare

 的名为 AsCuloare 的导航属性的 FK。默认情况下,它将查找“CuloareId”或“Culoare_Id”。代码中的 
OnModelCreating
IEntityTypeConfiguration<Culoare>
 中必须有一些配置来配置该关联,我怀疑您会发现它将其标记为 
.IsRequired(true)
。删除它应该将连接更正为可选 /w 
LEFT JOIN

© www.soinside.com 2019 - 2024. All rights reserved.