在1中包含2个实体

时间:2018-01-05 22:34:56

标签: c# entity-framework iqueryable

我有一个实体汽车(汽车)

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个实体,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实体链接到主Auto实体。但我无法弄清楚如何连接第三个实体“Eigenaar”,因为IIncludableQueryable只允许2个参数。

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

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

显然这不起作用,我应该用另一个功能来完成这个吗?

1 个答案:

答案 0 :(得分:1)

您不应该明确依赖IIncludableQueryable,只需继续返回IQueryable以遵循LinQ的惯例:

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

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

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