public IQueryable <CarModel> GetCars(int carStoreId,
                                             [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var carsModels = this.PerformOperation <IQueryable <CarModel> >(() =>
            {
                UserValidator.ValidateSessionKey(sessionKey);

                using (var context = this.ContextFactory.Create())
                {
                    var carStore = context.Set <CarStore>().Find(carStoreId);
                    if (carStore == null)
                    {
                        throw new InvalidOperationException("Car store with provided ID does not exist!");
                    }

                    var carModels   = new List <CarModel>();
                    var carEntities = carStore.Cars;
                    foreach (var carEntity in carEntities)
                    {
                        carModels.Add(CarsMapper.ToModel(carEntity));
                    }

                    return(carModels.AsQueryable <CarModel>());
                }
            });

            return(carsModels);
        }
        public IQueryable <CarModel> GetMyRentedCars(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var rentedCars = this.PerformOperation <IQueryable <CarModel> >(() =>
            {
                UserValidator.ValidateSessionKey(sessionKey);

                using (var context = this.ContextFactory.Create())
                {
                    var user = context.Set <User>().FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password!");
                    }

                    var rentedCarModels   = new List <CarModel>();
                    var rentedCarEntities = context.Set <Car>().Where(c => c.Renter.DisplayName == user.DisplayName);
                    foreach (var carEntity in rentedCarEntities)
                    {
                        rentedCarModels.Add(CarsMapper.ToModel(carEntity));
                    }

                    return(rentedCarModels.AsQueryable <CarModel>());
                }
            });

            return(rentedCars);
        }
        public IQueryable <CarModel> GetAll()
        {
            var allCars = this.PerformOperation <IQueryable <CarModel> >(() =>
            {
                using (var context = this.ContextFactory.Create())
                {
                    var carModels   = new List <CarModel>();
                    var carEntities = context.Set <Car>().Include("Renter").OrderBy(c => c.Make).ThenBy(c => c.Model);
                    foreach (var carEntity in carEntities)
                    {
                        carModels.Add(CarsMapper.ToModel(carEntity));
                    }

                    return(carModels.AsQueryable <CarModel>());
                }
            });

            return(allCars);
        }