// -DtoQuery

        public async Task <StudentDto> CreateStudentAsync(StudentDto studentDto, string username)
        {
            OnCreate(studentDto, username);

            var entity = StudentDto.AsStudentFunc(studentDto);

            ToEntity(ref entity, studentDto);
            //entity.InsertUser = entity.LastActivityUser = username;
            //entity.InsertDateTime = entity.LastActivityDateTime = DateTime.UtcNow;
            entity.AddTracker(username);

            _context.Students.Add(entity);

            OnBeforeCreate(entity, username);
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                // _context.Entry(entity).State = EntityState.Detached;
                throw new Exception("Add error", ex);
            }
            finally
            {
                // _context.Entry(entity).State = EntityState.Detached;
            }
            OnAfterCreate(entity, username);

            // studentDto = StudentDto.AsStudentDtoFunc(entity);
            studentDto = await GetStudentDtoAsync(entity.Id, StudentDto.IncludeNavigations());

            return(studentDto);
        }
        public async Task <ActionResult <StudentDto> > GetStudent(int id)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var student = await studentService.GetStudentDtoAsync(id, StudentDto.IncludeNavigations());

            if (student == null)
            {
                return(NotFound());
            }

            return(student);
        }
        public async Task <bool> UpdateStudentAsync(StudentDto studentDto, string username /*, String[] includeNavigations, params Expression<Func<Student, bool>>[] filters*/)
        {
            OnUpdate(studentDto, username);

            // Get Student
            var entity = EntityQuery(_context, StudentDto.IncludeNavigations())
                         .FirstOrDefault(x => x.Id == studentDto.Id);

            if (entity != null)
            {
                entity = StudentDto.ToStudentFunc(entity, studentDto);

                ToEntity(ref entity, studentDto);
                //entity.UpdateUser = entity.LastActivityUser = username;
                //entity.UpdateDateTime = entity.LastActivityDateTime = DateTime.UtcNow;
                entity.EditTracker(username);

                OnBeforeUpdate(entity, username);
                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    // _context.Entry(entity).State = EntityState.Detached;
                    throw new Exception("Update error", ex);
                }
                finally
                {
                    // _context.Entry(entity).State = EntityState.Detached;
                }
                OnAfterUpdate(entity, username);
            }
            else
            {
                return(false);
            }

            return(true);
        }
        public async Task <ActionResult <IEnumerable <StudentDto> > > GetStudents(string searchText   = null
                                                                                  , string matricNo   = null
                                                                                  , string lastname   = null
                                                                                  , string firstname  = null
                                                                                  , string middlename = null
                                                                                  /*, int pageNumber=1, int pageSize=7*/)
        {
            // var students = _context.Students.Select(StudentDto.AsStudentDto);
            List <Expression <Func <StudentDto, bool> > > filters = null;

            if (String.IsNullOrEmpty(searchText) &&
                (String.IsNullOrEmpty(matricNo)) &&
                (String.IsNullOrEmpty(lastname)) &&
                (String.IsNullOrEmpty(firstname)) &&
                (String.IsNullOrEmpty(middlename))

                )
            {
                // return null;
            }
            else
            {
                filters = new List <Expression <Func <StudentDto, bool> > >();

                if (!String.IsNullOrEmpty(searchText))
                {
                    if (searchText.CompareTo("*") != 0 && searchText.CompareTo("%") != 0)
                    {
                        filters.Add(x => x.Id.ToString().Contains(searchText));
                    }
                }

                if (!String.IsNullOrEmpty(matricNo))
                {
                    filters.Add(x => x.MatricNo == matricNo);
                }

                if (!String.IsNullOrEmpty(lastname))
                {
                    filters.Add(x => x.Lastname == lastname);
                }

                if (!String.IsNullOrEmpty(firstname))
                {
                    filters.Add(x => x.Firstname == firstname);
                }

                if (!String.IsNullOrEmpty(middlename))
                {
                    filters.Add(x => x.Middlename == middlename);
                }
            }

            //sort
            //return students.OrderBy(o => o.Id).Skip(((pageNumber - 1) * pageSize)).Take(pageSize);

            // OnSelectQuery(ref students);

            // return await students.ToListAsync();

            if (filters == null)
            {
                return(await studentService.GetStudentDtoesAsync(StudentDto.IncludeNavigations()));
            }
            else
            {
                return(await studentService.GetStudentDtoesAsync(StudentDto.IncludeNavigations(), filters.ToArray()));
            }
        }