在 1 中包含 2 个实体

Include 2 entities in 1

我有实体汽车(汽车)

public class Auto : BaseDbEntity
{
    public string Kleur { get; set; }
    public DateTime DatumGekocht { get; set; }
    public string Nummerplaat { get; set; }
    //relations
    public Eigenaar HuidigeEigenaar { get; set; }
    public AutoType HuidigeAutoType { get; set; }
}

还有 2 个实体 link 加入了这个实体,Eigenaar(所有者)和 AutoType

public class Eigenaar : BaseDbEntity
{
    public string Voornaam { get; set; }
    public string Achternaam { get; set; }
    public string Naam => $"{Voornaam} {Achternaam}";
}

public class AutoType : BaseDbEntity
{
    public string Merk { get; set; }
    public string Model { get; set; }
}

在我的 AutoDataService 中,我有以下内容:

public List<Auto> GetAllAutosSortedByName(AutoCriteria criteria)
{
    return GetFullyGraphedAutos()
        .Where(x => string.IsNullOrEmpty(criteria.Name))
        .OrderBy(x => x.Id).ToList();
}

private IIncludableQueryable<Auto, AutoType> GetFullyGraphedAutos()
{
    return _entityContext.Autos.Include(x => x.HuidigeAutoType);
}

这样我就可以将 AutoType 实体 link 编辑到主 Auto 实体。但是我不知道如何 link 第三个实体 "Eigenaar" 因为 IIncludableQueryable 只允许 2 个参数。

我认为它需要看起来像这样

private IIncludableQueryable<Auto, AutoType, Eigenaar> GetFullyGraphedAutos()
{
    return _entityContext.Autos.Include(x => x.HuidigeAutoType).thenInclude(x => x.HuidigeEigenaar);
}

显然这行不通,我应该使用另一个函数来完成这个吗?

您不应显式依赖 IIncludableQueryable,只需继续 return IQueryable 以遵循 LinQ 的约定:

private IQueryable<Auto> GetFullyGraphedAutos()
{
    return _entityContext.Autos
        .Include(x => x.HuidigeAutoType)
        .Include(x => x.HuidigeEigenaar);
}

我还建议您使用 DbContext 的 I/O 绑定方法的异步版本(实际执行查询的方法,如 ToListFirst, 等), 特别是考虑到你正在开发一个网络应用程序:

public async Task<List<Auto>> GetAllAutosSortedByNameAsync(AutoCriteria criteria)
{
    return await GetFullyGraphedAutos()
        .Where(x => string.IsNullOrEmpty(criteria.Name))
        .OrderBy(x => x.Id)
        .ToListAsync();
}