Расширьте мой веб-API (EF asp.core) для вызова сохраненного proc
Привет, я очень новичок в разработке веб-приложений и API и пытаюсь создать очень простой API для подключения к локальной базе данных SQL. Конечная цель будет заключаться в том, чтобы протолкнуть это в Azure и создать приложение для Android для пользовательского интерфейса.
Я построил свой API (с помощью EF Scaffolding), и он работает в отладке, возвращая данные из соответствующих таблиц БД через мои модели и контроллеры
Однако мне нужно вернуть данные из 2 таблиц (Inner joined), но мой scaffolded API возвращает только данные, связанные с конкретной таблицей, построенной EF..
Мои модели и контроллеры..
практическая модель
using System; using System.Collections.Generic; namespace NSC_API.Models { public partial class Practice { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string ContactName { get; set; } public string ContactAddress { get; set; } public string ContactEmail { get; set; } public int? Milage { get; set; } } }
PracticesController
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 NSC_API.Models; namespace NSC_API.Controllers { [Route("api/[controller]")] [ApiController] public class PracticesController : ControllerBase { private readonly NSClinical_DBContext _context; public PracticesController(NSClinical_DBContext context) { _context = context; } // GET: api/Practices [HttpGet] public async Task<ActionResult<IEnumerable<Practice>>> GetPractice() { return await _context.Practice.ToListAsync(); } // GET: api/Practices/5 [HttpGet("{id}")] public async Task<ActionResult<Practice>> GetPractice(int id) { var practice = await _context.Practice.FindAsync(id); if (practice == null) { return NotFound(); } return practice; } // PUT: api/Practices/5 // To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. [HttpPut("{id}")] public async Task<IActionResult> PutPractice(int id, Practice practice) { if (id != practice.Id) { return BadRequest(); } _context.Entry(practice).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!PracticeExists(id)) { return NotFound(); } else { throw; } } return NoContent(); } // POST: api/Practices // To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. [HttpPost] public async Task<ActionResult<Practice>> PostPractice(Practice practice) { _context.Practice.Add(practice); await _context.SaveChangesAsync(); return CreatedAtAction("GetPractice", new { id = practice.Id }, practice); } // DELETE: api/Practices/5 [HttpDelete("{id}")] public async Task<ActionResult<Practice>> DeletePractice(int id) { var practice = await _context.Practice.FindAsync(id); if (practice == null) { return NotFound(); } _context.Practice.Remove(practice); await _context.SaveChangesAsync(); return practice; } private bool PracticeExists(int id) { return _context.Practice.Any(e => e.Id == id); } } }
Модель Рабочих Элементов
using System; using System.Collections.Generic; namespace NSC_API.Models { public partial class WorkItems { public int Id { get; set; } public DateTime? WiDate { get; set; } public DateTime? WiStartTime { get; set; } public DateTime? WiEndTime { get; set; } public int? Practice { get; set; } public string Rate { get; set; } public string Paid { get; set; } public string Revenue { get; set; } } }
WorkItemscontroller
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 NSC_API.Models; namespace NSC_API.Controllers { [Route("api/[controller]")] [ApiController] public class WorkItemsController : ControllerBase { private readonly NSClinical_DBContext _context; public WorkItemsController(NSClinical_DBContext context) { _context = context; } // GET: api/WorkItems [HttpGet] public async Task<ActionResult<IEnumerable<WorkItems>>> GetWorkItems() { return await _context.WorkItems.ToListAsync(); } // GET: api/WorkItems/5 [HttpGet("{id}")] public async Task<ActionResult<WorkItems>> GetWorkItems(int id) { var workItems = await _context.WorkItems.FindAsync(id); if (workItems == null) { return NotFound(); } return workItems; } // PUT: api/WorkItems/5 // To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. [HttpPut("{id}")] public async Task<IActionResult> PutWorkItems(int id, WorkItems workItems) { if (id != workItems.Id) { return BadRequest(); } _context.Entry(workItems).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!WorkItemsExists(id)) { return NotFound(); } else { throw; } } return NoContent(); } // POST: api/WorkItems // To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://go.microsoft.com/fwlink/?linkid=2123754. [HttpPost] public async Task<ActionResult<WorkItems>> PostWorkItems(WorkItems workItems) { _context.WorkItems.Add(workItems); await _context.SaveChangesAsync(); return CreatedAtAction("GetWorkItems", new { id = workItems.Id }, workItems); } // DELETE: api/WorkItems/5 [HttpDelete("{id}")] public async Task<ActionResult<WorkItems>> DeleteWorkItems(int id) { var workItems = await _context.WorkItems.FindAsync(id); if (workItems == null) { return NotFound(); } _context.WorkItems.Remove(workItems); await _context.SaveChangesAsync(); return workItems; } private bool WorkItemsExists(int id) { return _context.WorkItems.Any(e => e.Id == id); } } }
В БД таблицы\данные объединяются в рабочие элементы.Практика внутренней стыкуется с практикой.Идентификатор
Select wi.ID, wi.WI_Date, wi.WI_Start_Time, wi.WI_End_Time, PR.Name, Wi.Paid, wi.Revenue From Work_Items WI inner join Practice PR on WI.Practice = PR.ID
Любая помощь была бы очень признательна, так как я действительно борюсь..
спасибо за чтение..
Что я уже пробовал:
Я пытался прочитать несколько статей, но действительно борюсь и с каждым днем все больше запутываюсь.
Я принял первый подход к БД (просто потому, что мой фон больше в пространстве БД, мне нужно запустить серию специальных запросов в более поздний момент против БД, и я немного старомоден в этом отношении), и поэтому я изо всех сил пытаюсь найти подходящий ресурс, чтобы помочь..
My Stored proc simple calls: Select wi.ID, wi.WI_Date, wi.WI_Start_Time, wi.WI_End_Time, PR.Name, Wi.Paid, wi.Revenue From Work_Items WI inner join Practice PR on WI.Practice = PR.ID