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() }); }
public async Task <GetStudentsBlResult> GetStudents(GetStudentsBlContract contract) { return(await _studentsBlService.GetStudents(contract)); }