public List<Trip> Search(string username, string depDate, int? depLocId, int? arrLocId, double? price, int? seatNum, int? estHour, int? hour)
        {
            GenericRepository<Trip> tripRepo = new GenericRepository<Trip>();
            GenericRepository<User> userRepo = new GenericRepository<User>();
            DateTime departDate;
            List<Expression<Func<Trip, bool>>> filters = new List<Expression<Func<Trip, bool>>>();
            if (!string.IsNullOrEmpty(depDate))
            {
                if (DateTime.TryParse(depDate, out departDate))
                {
                    filters.Add(t => t.DepartDate >= departDate);
                }
            }
            if (!string.IsNullOrEmpty(username))
            {
                User user = userRepo.First(u => u.Username.Contains(username));
                filters.Add(t => t.UserId == user.UserId);
            }
            if (seatNum != -1)
            {
                filters.Add(t => t.AvailableSeatNumber >= seatNum);
            }
            if (depLocId != -1)
            {
                filters.Add(t => t.DepartLocationId == depLocId);
            }

            if (arrLocId != -1)
            {
                filters.Add(t => t.ArrivalLocationId == arrLocId);
            }
            if (hour != 0)
            {
                filters.Add(t => t.DepHour >= hour);
            }
            if (estHour != 0)
            {
                filters.Add(t => t.EstimatedHour < estHour);
            }
            if (price!= null)
            {
                filters.Add(t => t.Price <= price);
            }

            return tripRepo.GetByMultipleConditions(filters).ToList();
        }