在 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 绑定方法的异步版本(实际执行查询的方法,如 ToList
、First
, 等), 特别是考虑到你正在开发一个网络应用程序:
public async Task<List<Auto>> GetAllAutosSortedByNameAsync(AutoCriteria criteria)
{
return await GetFullyGraphedAutos()
.Where(x => string.IsNullOrEmpty(criteria.Name))
.OrderBy(x => x.Id)
.ToListAsync();
}
我有实体汽车(汽车)
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 绑定方法的异步版本(实际执行查询的方法,如 ToList
、First
, 等), 特别是考虑到你正在开发一个网络应用程序:
public async Task<List<Auto>> GetAllAutosSortedByNameAsync(AutoCriteria criteria)
{
return await GetFullyGraphedAutos()
.Where(x => string.IsNullOrEmpty(criteria.Name))
.OrderBy(x => x.Id)
.ToListAsync();
}