我如何使用包含多个级别的属性从 thenInclude 中获取特定列
How do i get specific columns from a thenInclude using Include with Multiple Levels of Properties
我在 Entity Framework 核心中包含了多个级别的 属性 集合。我的问题是我得到了每个级别的所有列,我想要的只是某些级别的一些特定数据
这是我的实体class
public class Afrapportering {
[Key]
public int Id { get; set; }
public bool Slettet { get; set; }
public string WorkzoneJournalnummer { get; set; }
public bool Ansvarsvurdering { get; set; }
public virtual ICollection<Rubrik> RubrikList { get; set; }
}
public class Rubrik {
[Key]
public int Id { get; set; }
public string OriginalVaerdi { get; set; }
public string KorrigeretVaerdi { get; set; }
public int AfrapporteringId { get; set; }
[JsonIgnore]
public virtual Afrapportering Afrapportering { get; set; }
[Required]
public int RubrikTypeId { get; set; }
public virtual RubrikType RubrikType { get; set; }
}
public class RubrikType {
[Key]
public int Id { get; set; }
public string RubrikNavn { get; set; }
public string Label { get; set; }
public string RubrikNummer { get; set; } //skal vaere string da den kan hedde ex. "42b"
public string XmlTag { get; set; }
public virtual IList<RubrikMuligFejl> RubrikMuligFejlList { get; set; }
}
public class RubrikMuligFejl {
[Required]
public int RubrikTypeID { get; set; }
[JsonIgnore]
public virtual RubrikType RubrikType { get; set; }
[Required]
public int ProfilId { get; set; }
public virtual Profil Profil { get; set; }
[Required]
public int FejltekstId { get; set; }
public virtual Fejltekst Fejltekst { get; set; }
}
这是数据模型图
在我的存储库中,它看起来像这样:
public async Task<Afrapportering> GetById(int Id) {
var afrapportering = _context.AfrapporteringList
.Include(af => af.RubrikList)
.ThenInclude(r => r.RubrikType)
.ThenInclude(rt => rt.RubrikMuligFejlList)
.ThenInclude(rmf => rmf.Fejltekst)
.Where(af => af.Id == Id)
.FirstOrDefaultAsync();
return await afrapportering;
}
还有我的控制器
public async Task<ActionResult<Afrapportering>> GetAfrapportering(int id) {
var afrapportering = await _AfrapporteringRepository.GetById(id);
if (afrapportering == null)
{
return NotFound();
}
return Ok(afrapportering);
}
给定控制器的 JSON 结果如下所示:
{
"id": 2,
"slettet": false,
"workzoneJournalnummer": null,
"branchekode": 123213,
"toldmaessigAendringOpkraevning": 0.0,
"toldmaessigAendringTilbagebetaling": 0.0,
"oversendtTilAnalyse": false,
"ansvarsvurdering": false,
"rubrikList": [
{
"id": 17,
"originalVaerdi": "39426.0000",
"korrigeretVaerdi": null,
"afrapporteringId": 2,
"rubrikTypeId": 1,
"rubrikType": {
"id": 1,
"rubrikNavn": "statistisk værdi",
"label": "Statistisk værdi",
"rubrikNummer": "46",
"xmlTag": "Toldvaerdi_blb",
"rubrikMuligFejlList": [
{
"rubrikTypeID": 1,
"profilId": 1,
"profil": null,
"fejltekstId": 1,
"fejltekst": {
"id": 1,
"tekst": "Toldværdi for lav: tillæg forkert medregnet (royalties, licenser, emballage, knowhow, mæglerhonorar)",
"aktiv": true,
}
},
{
"rubrikTypeID": 1,
"profilId": 1,
"profil": null,
"fejltekstId": 2,
"fejltekst": {
"id": 2,
"tekst": "Toldværdi for høj: tillæg forkert medregnet (royalties, licenser, emballage, knowhow, mæglerhonorar)",
"aktiv": true,
}
} **and so on**
如何使 thenInclude 不包含 rubrikMuligFejlList 中的所有内容,但仅在 return json 时给我 Fejltekst.Tekst?
我试过的是
var afrapportering = _context.AfrapporteringList
.Include(af => af.RubrikList)
.ThenInclude(r => r.RubrikType)
.ThenInclude(rt => rt.RubrikMuligFejlList.Select(x => x.Fejltekst.Tekst))
.Where(af => af.Id == Id)
.FirstOrDefaultAsync();
但它不起作用
答案很简单:不使用Include,而是自定义投影。
var query =
from af in _context.AfrapporteringList
where af.Id == Id
select new
{
id = af.Id,
slettet = af.Slettet,
...
rubrikList = sf.RubrikList.Select(r => new
{
id = r.Id,
originalVaerdi = r.OriginalVaerdi,
...
rubrikMuligFejlList = r.RubrikMuligFejlList.Select(...)
})
};
我通过制作 DTO 类 解决了我的问题。在这里,我指定告诉我想要什么并将其发送为 json。
我还使用 automapper 帮助我将模型 类 映射到我的 dto 类。
我添加的 DTO 类
public class KontrolrapportDto
{
public int KontrolrapportId { get; set; }
public string Referencenummer { get; set; }
public string Varepostnummer { get; set; }
public string WorkzoneJournalnummer { get; set; }
public long Branchekode { get; set; }
public decimal ToldmaessigAendringOpkraevning { get; set; }
public decimal ToldmaessigAendringTilbagebetaling { get; set; }
public bool OversendtTilAnalyse { get; set; }
public bool Ansvarsvurdering { get; set; }
public string VaremodtagerNavn { get; set; }
public int VaremodtagerCVR { get; set; }
public int KlarererCVR { get; set; }
public DateTime AntagetDato { get; set; }
public DateTime? AfrapporteretDato { get; set; }
public DateTime? RedigeretDato { get; set; }
public FysiskKontrol FysiskKontrol { get; set; }
public ToldrapportDto Toldrapport { get; set; }
public List<RubrikTypeFejlteksterDto> RubrikTypeFejltekster { get; set; }
}
public class RubrikTypeFejlteksterDto
{
public string RubrikLabel { get; set; }
public string OriginalVaerdi { get; set; }
public string KorrigeretVaerdi { get; set; }
public List<string> MuligFejl { get; set; }
public List<string> ValgteFejl { get; set; }
}
并且在我的控制器中,我已将方法更新为 return dto 类
public async Task<ActionResult<KontrolrapportDto>> GetKontrolrapport(int id)
{
var kontrolrapport = await _kontrolrapportRepository.GetById(id);
if (kontrolrapport == null)
{
return NotFound();
}
var kontrolrapportDto = _mapper.Map<KontrolrapportDto>(kontrolrapport);
return Ok(kontrolrapportDto);
}
我在 Entity Framework 核心中包含了多个级别的 属性 集合。我的问题是我得到了每个级别的所有列,我想要的只是某些级别的一些特定数据
这是我的实体class
public class Afrapportering {
[Key]
public int Id { get; set; }
public bool Slettet { get; set; }
public string WorkzoneJournalnummer { get; set; }
public bool Ansvarsvurdering { get; set; }
public virtual ICollection<Rubrik> RubrikList { get; set; }
}
public class Rubrik {
[Key]
public int Id { get; set; }
public string OriginalVaerdi { get; set; }
public string KorrigeretVaerdi { get; set; }
public int AfrapporteringId { get; set; }
[JsonIgnore]
public virtual Afrapportering Afrapportering { get; set; }
[Required]
public int RubrikTypeId { get; set; }
public virtual RubrikType RubrikType { get; set; }
}
public class RubrikType {
[Key]
public int Id { get; set; }
public string RubrikNavn { get; set; }
public string Label { get; set; }
public string RubrikNummer { get; set; } //skal vaere string da den kan hedde ex. "42b"
public string XmlTag { get; set; }
public virtual IList<RubrikMuligFejl> RubrikMuligFejlList { get; set; }
}
public class RubrikMuligFejl {
[Required]
public int RubrikTypeID { get; set; }
[JsonIgnore]
public virtual RubrikType RubrikType { get; set; }
[Required]
public int ProfilId { get; set; }
public virtual Profil Profil { get; set; }
[Required]
public int FejltekstId { get; set; }
public virtual Fejltekst Fejltekst { get; set; }
}
这是数据模型图
在我的存储库中,它看起来像这样:
public async Task<Afrapportering> GetById(int Id) {
var afrapportering = _context.AfrapporteringList
.Include(af => af.RubrikList)
.ThenInclude(r => r.RubrikType)
.ThenInclude(rt => rt.RubrikMuligFejlList)
.ThenInclude(rmf => rmf.Fejltekst)
.Where(af => af.Id == Id)
.FirstOrDefaultAsync();
return await afrapportering;
}
还有我的控制器
public async Task<ActionResult<Afrapportering>> GetAfrapportering(int id) {
var afrapportering = await _AfrapporteringRepository.GetById(id);
if (afrapportering == null)
{
return NotFound();
}
return Ok(afrapportering);
}
给定控制器的 JSON 结果如下所示:
{
"id": 2,
"slettet": false,
"workzoneJournalnummer": null,
"branchekode": 123213,
"toldmaessigAendringOpkraevning": 0.0,
"toldmaessigAendringTilbagebetaling": 0.0,
"oversendtTilAnalyse": false,
"ansvarsvurdering": false,
"rubrikList": [
{
"id": 17,
"originalVaerdi": "39426.0000",
"korrigeretVaerdi": null,
"afrapporteringId": 2,
"rubrikTypeId": 1,
"rubrikType": {
"id": 1,
"rubrikNavn": "statistisk værdi",
"label": "Statistisk værdi",
"rubrikNummer": "46",
"xmlTag": "Toldvaerdi_blb",
"rubrikMuligFejlList": [
{
"rubrikTypeID": 1,
"profilId": 1,
"profil": null,
"fejltekstId": 1,
"fejltekst": {
"id": 1,
"tekst": "Toldværdi for lav: tillæg forkert medregnet (royalties, licenser, emballage, knowhow, mæglerhonorar)",
"aktiv": true,
}
},
{
"rubrikTypeID": 1,
"profilId": 1,
"profil": null,
"fejltekstId": 2,
"fejltekst": {
"id": 2,
"tekst": "Toldværdi for høj: tillæg forkert medregnet (royalties, licenser, emballage, knowhow, mæglerhonorar)",
"aktiv": true,
}
} **and so on**
如何使 thenInclude 不包含 rubrikMuligFejlList 中的所有内容,但仅在 return json 时给我 Fejltekst.Tekst?
我试过的是
var afrapportering = _context.AfrapporteringList
.Include(af => af.RubrikList)
.ThenInclude(r => r.RubrikType)
.ThenInclude(rt => rt.RubrikMuligFejlList.Select(x => x.Fejltekst.Tekst))
.Where(af => af.Id == Id)
.FirstOrDefaultAsync();
但它不起作用
答案很简单:不使用Include,而是自定义投影。
var query =
from af in _context.AfrapporteringList
where af.Id == Id
select new
{
id = af.Id,
slettet = af.Slettet,
...
rubrikList = sf.RubrikList.Select(r => new
{
id = r.Id,
originalVaerdi = r.OriginalVaerdi,
...
rubrikMuligFejlList = r.RubrikMuligFejlList.Select(...)
})
};
我通过制作 DTO 类 解决了我的问题。在这里,我指定告诉我想要什么并将其发送为 json。
我还使用 automapper 帮助我将模型 类 映射到我的 dto 类。
我添加的 DTO 类
public class KontrolrapportDto
{
public int KontrolrapportId { get; set; }
public string Referencenummer { get; set; }
public string Varepostnummer { get; set; }
public string WorkzoneJournalnummer { get; set; }
public long Branchekode { get; set; }
public decimal ToldmaessigAendringOpkraevning { get; set; }
public decimal ToldmaessigAendringTilbagebetaling { get; set; }
public bool OversendtTilAnalyse { get; set; }
public bool Ansvarsvurdering { get; set; }
public string VaremodtagerNavn { get; set; }
public int VaremodtagerCVR { get; set; }
public int KlarererCVR { get; set; }
public DateTime AntagetDato { get; set; }
public DateTime? AfrapporteretDato { get; set; }
public DateTime? RedigeretDato { get; set; }
public FysiskKontrol FysiskKontrol { get; set; }
public ToldrapportDto Toldrapport { get; set; }
public List<RubrikTypeFejlteksterDto> RubrikTypeFejltekster { get; set; }
}
public class RubrikTypeFejlteksterDto
{
public string RubrikLabel { get; set; }
public string OriginalVaerdi { get; set; }
public string KorrigeretVaerdi { get; set; }
public List<string> MuligFejl { get; set; }
public List<string> ValgteFejl { get; set; }
}
并且在我的控制器中,我已将方法更新为 return dto 类
public async Task<ActionResult<KontrolrapportDto>> GetKontrolrapport(int id)
{
var kontrolrapport = await _kontrolrapportRepository.GetById(id);
if (kontrolrapport == null)
{
return NotFound();
}
var kontrolrapportDto = _mapper.Map<KontrolrapportDto>(kontrolrapport);
return Ok(kontrolrapportDto);
}