public async Task GetStudents_FilterTest(GetStudentsBlContract contract, int[] idCheckList, int total)
        {
            var iStudentDbService = new Mock <IStudentDbService>();

            //Func<IQueryable<Student>, IQueryable<Student>> returnedFilter = null;

            iStudentDbService
            .Setup(x => x.GetStudentCount(It.IsAny <Func <IQueryable <Student>, IQueryable <Student> > >()))
            //.Callback<Func<IQueryable<Student>, IQueryable<Student>>>(filter => { returnedFilter = filter; })
            .Returns <Func <IQueryable <Student>, IQueryable <Student> > >(filter => Task.FromResult(filter(TestData.AsQueryable()).Count()));

            iStudentDbService
            .Setup(x => x.GetStudents(It.IsAny <Func <IQueryable <Student>, IQueryable <Student> > >()))
            //.Callback<Func<IQueryable<Student>, IQueryable<Student>>, int, int>((filter, skip, take) => { returnedFilter = filter; })
            .Returns <Func <IQueryable <Student>, IQueryable <Student> > >((filter) => Task.FromResult(filter(TestData.AsQueryable()).AsEnumerable()));


            var result = await new StudentsBlService(iStudentDbService.Object).GetStudents(contract);


            Assert.IsNotNull(result, "Result");
            Assert.AreEqual(contract.PageNumber, result.PageNumber, "PageNumber");
            Assert.AreEqual(contract.PageSize, result.PageSize, "PageSize");
            Assert.AreEqual(total, result.Total, "Total");

            Assert.IsNotNull(result.Students, "StudentList");
            Assert.AreEqual(idCheckList.Length, result.Students.Count, "StudentListCount");

            var i = 0;

            foreach (var student in result.Students)
            {
                var stringNumber = idCheckList[i].ToString("D2");
                Assert.AreEqual(student.Id, new Guid($"{{00000000-0000-0000-0000-0000000000{stringNumber}}}"), "Wrong order");
                i++;
            }
        }
        public async Task <GetStudentsBlResult> GetStudents(GetStudentsBlContract contract)
        {
            if (contract == null)
            {
                return(new GetStudentsBlResult
                {
                    PageNumber = 1,
                    Students = new StudentBl[0],
                    Total = 0,
                });
            }

            var pageNumber = contract.PageNumber < 1 ? 1 : contract.PageNumber;
            var pageSize   = contract.PageSize < 1 ? 1 : contract.PageSize;

            IQueryable <Student> filter(IQueryable <Student> query)
            {
                if (!string.IsNullOrWhiteSpace(contract.FirstName))
                {
                    query = query.Where(x => x.FirstName.ToLower().Contains(contract.FirstName.ToLower()));
                }

                if (!string.IsNullOrWhiteSpace(contract.LastName))
                {
                    query = query.Where(x => x.LastName.ToLower().Contains(contract.LastName.ToLower()));
                }

                if (!string.IsNullOrWhiteSpace(contract.MiddleName))
                {
                    query = query.Where(x => x.MiddleName.ToLower().Contains(contract.MiddleName.ToLower()));
                }

                if (contract.Sex.HasValue)
                {
                    query = query.Where(x => x.Sex == contract.Sex.Value);
                }

                if (contract.Uids != null && contract.Uids.Any())
                {
                    query = query.Where(x => contract.Uids.Contains(x.Uid));
                }

                return(query.Where(x => !x.Deleted));
            }

            IQueryable <Student> postFilter(IQueryable <Student> query)
            {
                if (!string.IsNullOrWhiteSpace(contract.SortByField))
                {
                    Expression <Func <Student, object> > orderExpression = null;

                    switch (contract.SortByField)
                    {
                    case "FirstName":
                        orderExpression = (x) => x.FirstName;
                        break;

                    case "LastName":
                        orderExpression = (x) => x.LastName;
                        break;

                    case "MiddleName":
                        orderExpression = (x) => x.MiddleName;
                        break;

                    case "Uid":
                        orderExpression = (x) => x.Uid;
                        break;

                    case "Sex":
                        orderExpression = (x) => x.Sex;
                        break;
                    }

                    if (orderExpression != null)
                    {
                        if (contract.Desc)
                        {
                            query = query.OrderByDescending(orderExpression);
                        }
                        else
                        {
                            query = query.OrderBy(orderExpression);
                        }
                    }
                }

                return(query.Skip((pageNumber - 1) * pageSize).Take(pageSize));
            }

            var count = await _studentDbService.GetStudentCount(filter);

            var students = await _studentDbService.GetStudents((query) => postFilter(filter(query)));

            return(new GetStudentsBlResult
            {
                PageNumber = pageNumber,
                PageSize = pageSize,
                Total = count,
                Students = students.Select(x => new StudentBl
                {
                    FirstName = x.FirstName,
                    Id = x.Id,
                    LastName = x.LastName,
                    MiddleName = x.MiddleName,
                    Sex = x.Sex,
                    Uid = x.Uid,
                }).ToArray()
            });
        }
Esempio n. 3
0
 public async Task <GetStudentsBlResult> GetStudents(GetStudentsBlContract contract)
 {
     return(await _studentsBlService.GetStudents(contract));
 }