OData

Trong hướng dẫn này sử dụng OData v4

  1. Cài đặt thư viện Microsoft.AspNetCore.OData từ NuGet.

  2. Nhấn chuột phải vào thư mục muốn tạo controller OData rồi chọn Add > Controller. Chọn API controller with actions, using Entity Framework để tự động tạo controller OData với các thao tác xem/thêm/xóa/sửa mặc định.

    Controller OData

    Controller OData

  3. Sửa lại controller như sau

    using Microsoft.AspNet.OData; /* Sử dụng namespace */
    // -------------------
    /* Đổi tên route api/ theo ý mình */
    [Route("odata/[controller]")] 
    [ApiController]
    public class ProductsController : ODataController /* Đổi ControllerBase thành ODataController */
    {
        private readonly AdventureWorksContext _context;
    
        public ProductsController(AdventureWorksContext context)
        {
            _context = context;
        }
        // GET: api/Products
        [HttpGet]
        [EnableQuery] /* Thêm attribute để có thể sử dụng các cú pháp truy vấn */
        public async Task<ActionResult<IEnumerable<Product>>> GetProduct()
        {
            return await _context.Product.ToListAsync();
        }
    
        // GET: api/Products/5
        [HttpGet("{id}")]
        [EnableQuery] /* Thêm attribute để có thể sử dụng các cú pháp truy vấn */
        public async Task<ActionResult<Product>> GetProduct(int id)
        {
            // -----------------------
        }
        /*  */
    }
    
    • Sử dụng namespace Microsoft.AspNet.OData.
    • Thay đổi lớp được kế thừa từ ControllerBase thành ODataController.
    • Thêm attribute [EnableQuery] vào controller xử lý Get để có thể sử dụng các cú pháp truy vấn.
    • Đổi route api/ mặc định của controller OData thêm cài đặt của mình (ví dụ: odata/)
  4. Cấu hình ứng dụng sử dụng các controller OData

    public void ConfigureServices(IServiceCollection services)
    {
        // -----------------
        services.AddOData();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ---------------------
        app.UseEndpoints(endpoints =>
        {
            // ----------------
            endpoints.Select().Filter().OrderBy().Expand().Count().MaxTop(50);
            endpoints.MapODataRoute("odata", "odata", GetEdmModel());
        });
    }
    // Thêm phương thức hỗ trợ build các route OData
    private IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        // Các EntitySet khác
        return builder.GetEdmModel();
    }