我有一个实体汽车(汽车)
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);
}
显然这不起作用,我应该用另一个功能来完成这个吗?
答案 0 :(得分:1)
您不应该明确依赖IIncludableQueryable
,只需继续返回IQueryable
以遵循LinQ的惯例:
private IQueryable<Auto> GetFullyGraphedAutos()
{
return _entityContext.Autos
.Include(x => x.HuidigeAutoType)
.Include(x => x.HuidigeEigenaar);
}
我还建议您使用DbContext
的I / O绑定方法的异步版本(实际执行查询的方法,如ToList
,First
等) ,特别是考虑到您正在使用Web应用程序:
public async Task<List<Auto>> GetAllAutosSortedByNameAsync(AutoCriteria criteria)
{
return await GetFullyGraphedAutos()
.Where(x => string.IsNullOrEmpty(criteria.Name))
.OrderBy(x => x.Id)
.ToListAsync();
}