Source: Specific/Controllers/TestController.cs

using System.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System.Diagnostics;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.AspNetCore.Authorization;
using PublicAPI.Common.Services;

namespace PublicAPI.Specific.Controllers {
    [Authorize]
    [ApiController]
    [Route("api/[controller]")]

    /**
        * Test controller (methods for testing)
        @module TestController
*/
    public class TestController : ControllerBase {
        private readonly AppOptions _options;
        private readonly Db _db;

        public TestController(IOptions<AppOptions> options, Db db) {
            _options = options.Value;
            _db = db;
        }
        /**
            * Get users
            * @return {ActionResult} - Users    
*/
        [HttpGet("GetUsers")]
        public async Task<ActionResult> GetUsers() {
            var users = await _db.QueryAsync("SELECT * FROM t1", null, _options.ConnectionString, true, cmdType: CommandType.Text);
            return Ok(users);
        }

        /**
            * Get neighborhoods
            * @return {ActionResult} - Neighborhoods
*/
        [HttpGet("GetNeighborhoods")]
        public async Task<ActionResult> GetNeighborhoods() {
            //var r = await _db.QueryAsync("select name, st_asgeojson(geom) FROM nyc_neighborhoods", null, _options.ConnectionString, true, cmdType: CommandType.Text);
            var r = await _db.QueryAsync("test.getneighborhoods", null, _options.ConnectionString, true, cmdType: CommandType.StoredProcedure);

            return Ok(r);
        }
        /**
            * Get neighborhoods in an extent
            * @param {double} l - Left
            * @param {double} b - Bottom
            * @param {double} r - Right
            * @param {double} t - Top
            * @return {ActionResult} - Neighborhoods extent
*/
        [HttpGet("GetNeighborhoodsextent")]
        public async Task<ActionResult> GetNeighborhoodsextent(double l, double b, double r, double t, double z) {
            //var r = await _db.QueryAsync("select name, st_asgeojson(geom) FROM nyc_neighborhoods", null, _options.ConnectionString, true, cmdType: CommandType.Text);
            var ret = await _db.QueryJsonAsync("test.getneighborhoodsextent", new { l, b, r, t, z }, _options.ConnectionString, true, cmdType: CommandType.StoredProcedure);
            Debug.WriteLine(ret);
            return Ok(ret);
        }

        /**
            * Get land parcels in an extent
            * @param {double} left - Left
            * @param {double} bottom - Bottom
            * @param {double} right - Right
            * @param {double} top - Top
            * @return {ActionResult} - Land parcels in extent
*/
        [HttpGet("GetLandParcels")]
        public async Task<ActionResult> GetLandParcels(double left, double bottom, double right, double top) {
            var ret = await _db.QueryJsonAsync("test.get_land_parcels", new { l = left, b = bottom, r = right, t = top }, _options.ConnectionString, true, cmdType: CommandType.StoredProcedure);
            Debug.WriteLine(ret);
            return Ok(ret);
        }
    }
}