public JsonResult GetUserCategoryList(DataTableViewModel dataTableViewModel)
        {
            string SearchLevel1Str = Request.QueryString["SearchLevel1"];
            int?   SearchLevel1    = !string.IsNullOrEmpty(SearchLevel1Str) ? int.Parse(SearchLevel1Str) as int? : null;

            string SearchLevel2Str = Request.QueryString["SearchLevel2"];
            int?   SearchLevel2    = !string.IsNullOrEmpty(SearchLevel2Str) ? int.Parse(SearchLevel2Str) as int? : null;

            string SearchLevel3Str = Request.QueryString["SearchLevel3"];
            int?   SearchLevel3    = !string.IsNullOrEmpty(SearchLevel3Str) ? int.Parse(SearchLevel3Str) as int? : null;

            string SearchLevel4Str = Request.QueryString["SearchLevel4"];
            int?   SearchLevel4    = !string.IsNullOrEmpty(SearchLevel4Str) ? int.Parse(SearchLevel4Str) as int? : null;

            string SearchName = Request.QueryString["SearchName"];

            var includeMultiProperties = new Expression <Func <ACT.Models.UserCategory, object> >[] { x => x.Level2, y => y.Level1, z => z.Level3, t => t.Level4 };

            var data = _UserCategoryService.ListWithPaging(
                filter: x => (SearchLevel1 == null || x.Level1Id == SearchLevel1) && (SearchLevel2 == null || x.Level2Id == SearchLevel2) && (SearchLevel3 == null || x.Level3Id == SearchLevel3) && (SearchLevel4 == null || x.Level4Id == SearchLevel4) && x.Name.Contains(SearchName),
                includeProperties: includeMultiProperties,
                orderBy: o => o.DisplayOrder,
                pageSize: dataTableViewModel.length,
                page: dataTableViewModel.start);

            //fix serilaize json >>
            var dataMapped = Mapper.Map <List <UserCategoryViewModel> >(data.EntityData);

            return(Json(new { data = dataMapped, recordsTotal = data.Count, recordsFiltered = data.Count }, JsonRequestBehavior.AllowGet));
        }