我如何使用包含多个级别的属性从 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);
    }