c# - 即使我强制 .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
描述 成功
解决方案
因此,如果问题不是完整的数据,则解决方案应该很容易。我认为您必须急切地加载嵌套属性。
如果您的模型是:
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);
}
推荐阅读
- php - Yii2 Twitter Bootstrap 徽章颜色不变:未找到徽章-成功徽章-危险等类
- python - 如何将 python 脚本更改为应用程序
- angular - 单击模态中的图标时如何更改元素的样式?
- java - 使用 AllPermission 启用 Java SecurityManager
- python - 如何从 Queue 类移动到 Stack 类,然后是计算函数?
- jquery - select2 多选项全选框给出 TypeError
- php - 从数组中删除值 - 按值
- python - 在 Peewee 中以编程方式构建 OR WHERE
- cron - 尽管它正在运行,但 Cron 没有创建文件
- php - 将数组中的数字与一系列值进行比较