public JsonResult AjaxDataProvider(DatatableAjaxModel param)
        {
            IEnumerable <Customer> Customers = _context.Customers;
            var totalCustomers  = _context.Customers.Count();
            var json            = Newtonsoft.Json.JsonConvert.SerializeObject(param);
            var sortDirection   = HttpContext.Request.Query["sSortDir_0"]; // asc or desc
            var sortColumnIndex = Convert.ToInt32(HttpContext.Request.Query["iSortCol_0"]);

            if (!string.IsNullOrEmpty(param.sSearch))
            {
                Customers = Customers.Where(z => z.FirstName.ToLower().Contains(param.sSearch.ToLower()) || z.LastName.ToLower().Contains(param.sSearch.ToLower()) || z.City.ToLower().Contains(param.sSearch.ToLower()) || z.Country.ToLower().Contains(param.sSearch.ToLower()) || z.Phone.ToLower().Contains(param.sSearch.ToLower()));
            }

            switch (sortColumnIndex)
            {
            case 1:
                Customers = sortDirection == "asc" ? Customers.OrderBy(z => z.FirstName) : Customers.OrderByDescending(z => z.FirstName);
                break;

            case 2:
                Customers = sortDirection == "asc" ? Customers.OrderBy(z => z.LastName) : Customers.OrderByDescending(z => z.LastName);
                break;

            case 3:
                Customers = sortDirection == "asc" ? Customers.OrderBy(z => z.City) : Customers.OrderByDescending(z => z.City);
                break;

            case 4:
                Customers = sortDirection == "asc" ? Customers.OrderBy(z => z.Country) : Customers.OrderByDescending(z => z.Country);
                break;

            case 5:
                Customers = sortDirection == "asc" ? Customers.OrderBy(z => z.Phone) : Customers.OrderByDescending(z => z.Phone);
                break;

            default:
                Customers = Customers.OrderBy(z => z.Id);
                break;
            }
            var filteredCustomersCount = Customers.Count();

            Customers = Customers.Skip(param.iDisplayStart).Take(param.iDisplayLength);
            return(Json(new
            {
                sEcho = param.sEcho,
                iTotalRecords = totalCustomers,
                iTotalDisplayRecords = filteredCustomersCount,
                aaData = Customers
            }));
        }
        public JsonResult AjaxDataProvider([FromRoute] int id, DatatableAjaxModel param)
        {
            IEnumerable <Order> Orders = _context.Orders.Include(z => z.OrderItems).ThenInclude(o => o.Product).Where(z => z.CustomerId == id);
            var totalOrders            = _context.Orders.Count(z => z.CustomerId == id);
            var json            = Newtonsoft.Json.JsonConvert.SerializeObject(param);
            var sortDirection   = HttpContext.Request.Query["sSortDir_0"]; // asc or desc
            var sortColumnIndex = Convert.ToInt32(HttpContext.Request.Query["iSortCol_0"]);

            if (!string.IsNullOrEmpty(param.sSearch))
            {
                Orders = Orders.Where(z => z.OrderNumber.Contains(param.sSearch) || z.OrderDate.ToString().Contains(param.sSearch) || z.TotalAmount.ToString().Contains(param.sSearch));
            }

            switch (sortColumnIndex)
            {
            case 1:
                Orders = sortDirection == "asc" ? Orders.OrderBy(z => z.OrderNumber) : Orders.OrderByDescending(z => z.OrderNumber);
                break;

            case 2:
                Orders = sortDirection == "asc" ? Orders.OrderBy(z => z.OrderDate) : Orders.OrderByDescending(z => z.OrderDate);
                break;

            case 3:
                Orders = sortDirection == "asc" ? Orders.OrderBy(z => z.TotalAmount) : Orders.OrderByDescending(z => z.TotalAmount);
                break;

            default:
                Orders = Orders.OrderBy(z => z.Id);
                break;
            }
            var filteredOrdersCount = Orders.Count();

            Orders = Orders.Skip(param.iDisplayStart).Take(param.iDisplayLength);
            return(Json(new
            {
                sEcho = param.sEcho,
                iTotalRecords = totalOrders,
                iTotalDisplayRecords = filteredOrdersCount,
                aaData = Orders
            }));
        }