首页 > 解决方案 > 即使我强制 .include 延迟加载也无法正常工作

问题描述

我正在尝试获取具有 3 个值数组的主表,但它根本不起作用。我不知道如何解决这个问题,我在控制器上使用默认获取:

public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        return _context.SelfAssessment;
    }

我想根据要求得到什么:

    {
        "userEmail": "user@email.com",
        "createdAt": "2018-12-10T08:02:16.117",
        "update": false,
        "discomfort": [
        {
          "bodyPartId": 1,
          "intensityId": 1,
          "frequencyId": 1
        }
      ],
      "saanswers": [
        {
          "answerId": 1
        }
      ], 
      "sapostures": [
        {
          "postureAnswerId": 1,
          "postureId": 1,
        }
      ]
    }

我收到了这个 Json,但有如下空数组:

   {
      "userEmail": "user@mail.com",
      "createdAt": "2018-12-10T08:02:16.117",
      "update": false,
      "discomfort": [],
      "saanswers": [],
      "sapostures": []
   }

这是我下面的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using ErgoSAFE_API.Models;

namespace ErgoSAFE_API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SelfAssessmentsController : ControllerBase
{
    private readonly ErgoSAFEContext _context;

    public SelfAssessmentsController(ErgoSAFEContext context)
    {
        _context = context;
    }

    // GET: api/SelfAssessments
    [HttpGet]
    public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        return _context.SelfAssessment;
    }

    // GET: api/SelfAssessments/5
    [HttpGet("{id}")]
    public async Task<IActionResult> GetSelfAssessment([FromRoute] int id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var selfAssessment = await _context.SelfAssessment.FindAsync(id);

        if (selfAssessment == null)
        {
            return NotFound();
        }

        return Ok(selfAssessment);
    }

    // PUT: api/SelfAssessments/5
    [HttpPut("{id}")]
    public async Task<IActionResult> PutSelfAssessment([FromRoute] int id, [FromBody] SelfAssessment selfAssessment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != selfAssessment.SelfAssessmentId)
        {
            return BadRequest();
        }

        _context.Entry(selfAssessment).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!SelfAssessmentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

    // POST: api/SelfAssessments
    [HttpPost]
    public async Task<IActionResult> PostSelfAssessment([FromBody] SelfAssessment selfAssessment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.SelfAssessment.Add(selfAssessment);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSelfAssessment", new { id = selfAssessment.SelfAssessmentId }, selfAssessment);
    }

    // DELETE: api/SelfAssessments/5
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteSelfAssessment([FromRoute] int id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var selfAssessment = await _context.SelfAssessment.FindAsync(id);
        if (selfAssessment == null)
        {
            return NotFound();
        }

        _context.SelfAssessment.Remove(selfAssessment);
        await _context.SaveChangesAsync();

        return Ok(selfAssessment);
    }

    private bool SelfAssessmentExists(int id)
    {
        return _context.SelfAssessment.Any(e => e.SelfAssessmentId == id);
    }
}
}

.net 核心 2.1.403

使用 VSCode,而不是 Visual Studio

编辑1:

        public IEnumerable<Object> Find (int id) {
        IQueryable<object> entryPoint = (from sa in _context.SelfAssessments
                          join a in _context.Answers on sa.SelfAssessmentId equals a.SelfAssessmentId
                          join q in _context.Questions on a.QuestionId equals q.QuestionId
                          where sa.SelfAssessmentId == id
                          select new {
                              SelfAssessmentID = sa.SelfAssessmentId,
                              Yearly = sa.Yearly,
                              Moved = sa.Moved,
                              CreatedAt = sa.CreatedAt,
                              Question = q.Description,
                              Value = a.Value
                          }).Take(10);
        List<object> result = entryPoint.ToList();

        return result;
    }

编辑2:

我对控制器进行了一些更改,当我调试代码时,我可以看到值即将到来,但是当我尝试返回结果时没有错误。

控制器:

[HttpGet]
    public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        var qry = from s in _context.SelfAssessment
                  select s;

        var results = qry.Include("Discomfort").ToList();
        results = qry.Include("Sapostures").ToList();
        results = qry.Include("Saanswers").ToList();

        return results;
    }

招摇结果:

代码
未记录

详细信息错误:OK

回应

代码
200

描述 成功

标签: c#apiasp.net-web-apilazy-loadingasp.net-core-webapi

解决方案


因此,如果问题不是完整的数据,则解决方案应该很容易。我认为您必须急切地加载嵌套属性。

如果您的模型是:

    public class MainEntity
    {
        public int Id { get; set; }
        ICollection<MiddleEntity> MiddleEntities { get; set; }
        //Other properties...
    }

    public class MiddleEntity
    {
        public int Id { get; set; }

        public int MainEntityId { get; set; }
        public MainEntity MainEntity { get; set; }

        ICollection<InnerEntity> InnerEntities { get; set; }
        //Other properties...
    }

    public class InnerEntity
    {
        public int Id { get; set; }

        public int MiddleEntityId { get; set; }
        public MiddleEntity MiddleEntity { get; set; }
        //Other properties...
    }

解决方案应该是:

    [HttpGet("{Id}")]
    public ActionResult<IEnumerable<MainEntity>> GetMainEntities(int Id)
    {
        var result = _context.MainEtities
            .Include(x => x.MiddleEntities)
                .ThenInclude(y => y.InnerEntities)
            .ToList();

        return Ok(result);
    }

推荐阅读