Пример #1
0
        public void GenericPagingTest()
        {
            var query = Persons.AsQueryable();
            var vm    = new SortingFilterModel {
                PageSize = 3
            };
            var filterService = new FilterService(new ExpressionBuilder(), new SortingService(new ExpressionBuilder()));

            var resultSet = filterService.GenericPaging(query, vm.AsSortingFilterModel);

            //assert the page total
            Assert.IsTrue(vm.PageTotal == 4, "page totle calculation is incorrect");
            //assert the content within page 1, no need to default orderby since it only do take no skip
            Assert.IsTrue(resultSet.Select(x => x.Name).Contains("joe"), "the paging result contains incorrect elment");
            Assert.IsTrue(resultSet.Select(x => x.Name).Contains("kelly"), "the paging result contains incorrect elment");
            Assert.IsTrue(resultSet.Select(x => x.Name).Contains("nancy"), "the paging result contains incorrect elment");

            //set pageindex other than 1, run the function again, test if orderby + skip + take returns the correct resultset
            vm.PageIndex            = 3;
            vm.SortingColumnCurrent = "BornDate";
            vm.SortingOrderCurrent  = SortingOrder.Ascending;
            resultSet = filterService.GenericPaging(query, vm.AsSortingFilterModel);
            var compareList = Persons.OrderByDescending(x => x.BornDate).Skip(6).Take(3).ToList();

            Assert.IsTrue(resultSet.ToList()[0].PersonID == compareList[0].PersonID);
            Assert.IsTrue(resultSet.ToList()[1].PersonID == compareList[1].PersonID);
            Assert.IsTrue(resultSet.ToList()[2].PersonID == compareList[2].PersonID);
        }
Пример #2
0
        public IQueryable <T> GenericPaging <T>(IQueryable <T> queryableData, SortingFilterModel Model)
        {
            //always recalculate the count
            var count = queryableData.Count();

            Model.PageTotal = count / Model.PageSize + (count % Model.PageSize == 0 ? 0 : 1);


            //if submit index is 0, do take no skip
            IQueryable <T> results = null;

            if (Model.ShouldResetPageIndex || Model.PageIndex > Model.PageTotal)
            {
                Model.PageIndex = 1;
            }
            //if query contains no order by, perform it on the default column
            if (!Model.HasBeenSorted)
            {
                queryableData = SortingService.SortQueryDefaultColumn(queryableData, Model);
            }
            if (Model.PageIndex == 1)
            {
                results = queryableData.Take(Model.PageSize);
            }
            else
            {
                results = queryableData.Skip((Model.PageIndex - 1) * Model.PageSize).Take(Model.PageSize);
            }
            Model.ShouldResetPageIndex = false;
            ReCaculateSinglePageDatas(Model);
            return(results);
        }
Пример #3
0
        public void GenericContainTest()
        {
            var vm            = new SortingFilterModel();
            var filterService = new FilterService(new ExpressionBuilder(), new SortingService(new ExpressionBuilder()));
            var query         = Persons.AsQueryable();

            query = filterService.AppendQueryWithContains <Person>("PhoneNr", "12345", query, vm.AsSortingFilterModel);
            Assert.IsTrue(query.Count() == 4);
        }
Пример #4
0
        public void GenericPagingSinglePageDatasCalculationTest()
        {
            //setup view model
            var filterSerivce = new FilterService(new ExpressionBuilder(), new SortingService(new ExpressionBuilder()));
            var vm            = new SortingFilterModel();

            vm.PageSize = 20;


            //test senario 1, total as 900, index 1, should return 5 singlepagedata, with the page1 as selected
            vm.PageTotal = 900;
            vm.PageIndex = 1;
            filterSerivce.ReCaculateSinglePageDatas(vm);

            var singlePageDatas = vm.SinglePageDatas;

            Assert.IsTrue(singlePageDatas.FirstOrDefault() != null && singlePageDatas.FirstOrDefault().IsCurrentPageSelected == true, "the first page is not selected");

            Assert.IsTrue(singlePageDatas.Where(x => x.IsCurrentPageSelected == true).Count() == 1, "only one page is selected");
            Assert.IsTrue(singlePageDatas.Count() == 5, "total 5 pages as output");


            //test senario 2, set the pageindex to 6, then 4,5,6,7,8 should be presented
            vm.PageIndex = 6;
            filterSerivce.ReCaculateSinglePageDatas(vm);

            singlePageDatas = vm.SinglePageDatas;
            Assert.IsTrue(singlePageDatas.Count() == 5, "total 5 pages as output");
            Assert.IsTrue(singlePageDatas.IndexOf(singlePageDatas.FirstOrDefault(x => x.IsCurrentPageSelected)) == 2, "incorrect page is seleted");

            //test senario 3, move to last page, then 896, 897, 898, 899, 900 should be presented
            vm.PageIndex = 900;
            filterSerivce.ReCaculateSinglePageDatas(vm);

            singlePageDatas = vm.SinglePageDatas;
            Assert.IsTrue(singlePageDatas.Count() == 5, "total 5 pages as output");
            var index = singlePageDatas.IndexOf(singlePageDatas.FirstOrDefault(x => x.IsCurrentPageSelected));

            Assert.IsTrue(index == 4, "incorrect page is seleted");
        }
Пример #5
0
        public void GenericPagingWhereMixTest()
        {
            //setup view model
            var vm = new SortingFilterModel();

            vm.SortingColumnCurrent = "BornDate";
            vm.SortingOrderCurrent  = SortingOrder.Ascending;
            var filterService = new FilterService(new ExpressionBuilder(), new SortingService(new ExpressionBuilder()));
            var query         = Persons.AsQueryable();

            //total 10, 4 pages, set index to 4
            vm.PageIndex = 4;
            query        = query.Where(x => x.HasSupernaturalAbility == true);

            var resultSet = filterService.GenericPaging(query, vm.AsSortingFilterModel);

            //test1 the pageindex should have been resetted to 1
            Assert.IsTrue(vm.PageIndex == 1, "the where clause will make pagetotal 2, page index should be resetted to 1");
            //test2 navigate to page 2
            vm.PageIndex = 2;
            resultSet    = filterService.GenericPaging(query, vm.AsSortingFilterModel);
            Assert.IsTrue(vm.PageIndex == 2);
        }
Пример #6
0
        public void ReCaculateSinglePageDatas(SortingFilterModel Model)
        {
            Model.SinglePageDatas.Clear();
            var SinglePageDatasTmp = new List <SinglePageData>();
            //fake list, LeftRightBuffer times 4
            int total = Model.LeftRightBuffer * 4 + 1;
            //real list, LeftRightBuffer times 2
            var total1         = Model.LeftRightBuffer * 2 + 1;
            var startindex     = Model.PageIndex - Model.LeftRightBuffer * 2;
            var availableLeft  = 0;
            var availableRight = 0;


            for (var i = startindex; i < total + startindex; i++)
            {
                //if the 2 pages left, 2 pages right are out side of the index, dont add it
                if (i > 0 && i <= Model.PageTotal)
                {
                    if (i < Model.PageIndex)
                    {
                        availableLeft++;
                    }
                    else if (i > Model.PageIndex)
                    {
                        availableRight++;
                    }
                    var tmp = new SinglePageData {
                        PageLabel = i.ToString(), PageId = "singlepagedata" + i.ToString(), PageCssClass = "spd"
                    };
                    SinglePageDatasTmp.Add(tmp);


                    if (i == Model.PageIndex)
                    {
                        tmp.IsCurrentPageSelected = true;
                        tmp.PageCssClass         += " spdcurrent";
                    }
                }
            }

            //4 conditions
            if (availableLeft <= Model.LeftRightBuffer && availableRight <= Model.LeftRightBuffer)
            {
                Model.SinglePageDatas.AddRange(SinglePageDatasTmp);
            }
            else if (availableLeft > Model.LeftRightBuffer && availableRight > Model.LeftRightBuffer)
            {
                var toBeAddedElements = SinglePageDatasTmp.Skip(availableLeft - Model.LeftRightBuffer).Take(total1);
                Model.SinglePageDatas.AddRange(toBeAddedElements);
            }
            else if (availableLeft <= Model.LeftRightBuffer)
            {
                Model.SinglePageDatas.AddRange(SinglePageDatasTmp.Take(total1));
            }
            else if (availableRight <= Model.LeftRightBuffer)
            {
                SinglePageDatasTmp.Reverse();
                var toBeAddedElements = SinglePageDatasTmp.Take(total1).Reverse();
                Model.SinglePageDatas.AddRange(toBeAddedElements);
            }
        }
Пример #7
0
 protected void ResetPageIndex(SortingFilterModel Model)
 {
     Model.PageIndex            = 1;
     Model.ShouldResetPageIndex = false;
 }
Пример #8
0
        /// <summary>
        /// suppose to generate query like this
        /// Where(x => x.propertyA.ToLower().Contains(TargetValue.ToLower()));
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="MemberName"></param>
        /// <param name="TargetValue"></param>
        /// <returns></returns>
        public IQueryable <T> AppendQueryWithContains <T>(string MemberName, string TargetValue, IQueryable <T> queryableData, SortingFilterModel Model)
        {
            //create chainedrules at two-level deep, tolower as level1 and contains as level2
            var root = new ChainedRule(MemberName, Operator.ToLower, null);

            root.ChildRule = new ChainedRule(MemberName, Operator.Contains, TargetValue.ToLower());
            ParameterExpression p     = Expression.Parameter(typeof(T), "x");
            Expression          right = ExpBuilder.EvaluateChainedRule <T>(root, p);
            var whereExp = Expression.Lambda <Func <T, bool> >(right, new ParameterExpression[] { p });

            var whereMethodExpression = ExpBuilder.BuildMethodExpression(queryableData, Where, whereExp, typeArguments: new Type[] { queryableData.ElementType });


            IQueryable <T> results = queryableData.EvalQueryMethodCallExpression(whereMethodExpression);

            //ShouldResetPageIndex value is set at the front end, when freetext search is triggered, always get the content from pageindex1
            if (Model.ShouldResetPageIndex)
            {
                ResetPageIndex(Model);
            }
            return(results);
        }