private PreferencesViewModel BuildPreferencesViewModel(string userId)
        {
            var subscriptionPreferences          = DbContext.UserPreferences.OfType <SubscriptionPreference>().Where(u => u.User.Id == userId).ToList();
            var subscriptionPreferenceViewModels = from description in _reflectionService.GetSubscriptionDescriptions()
                                                   from maybeNullPreference in subscriptionPreferences.Where(sp => sp.SubscriptionName == description.Name).DefaultIfEmpty()
                                                   orderby description.Name
                                                   select new SubscriptionPreferenceViewModel()
            {
                Id = maybeNullPreference?.Id,
                SubscriptionName        = description.Name,
                SubscriptionDescription = description.Description,
                IsSmsRequested          = maybeNullPreference?.IsSmsRequested ?? false,
                IsEmailRequested        = maybeNullPreference?.IsEmailRequested ?? false,
            };

            var viewModel = new PreferencesViewModel()
            {
                SubscriptionPreferences = subscriptionPreferenceViewModels.ToList()
            };

            return(viewModel);
        }
        public ActionResult Edit(PreferencesViewModel viewModel)
        {
            var userId = User.GetUserId();

            if (!ModelState.IsValid)
            {
                return(PartialView("Edit", viewModel));
            }

            var user = DbContext.Users.Include(u => u.Preferences).First(u => u.Id == userId);

            var subscriptionPreferences = user.Preferences.OfType <SubscriptionPreference>()
                                          .Where(u => u.User.Id == userId)
                                          .ToDictionary(p => p.Id);

            foreach (var postedSubscriptionPreference in viewModel.SubscriptionPreferences)
            {
                SubscriptionPreference subscriptionPreference;
                if (postedSubscriptionPreference.Id == null ||
                    !subscriptionPreferences.TryGetValue(postedSubscriptionPreference.Id.Value, out subscriptionPreference))
                {
                    subscriptionPreference = DbContext.Set <SubscriptionPreference>().Add(new SubscriptionPreference()
                    {
                        SubscriptionName = postedSubscriptionPreference.SubscriptionName,
                        User             = user
                    });
                }

                subscriptionPreference.IsEmailRequested = postedSubscriptionPreference.IsEmailRequested;
                subscriptionPreference.IsSmsRequested   = postedSubscriptionPreference.IsSmsRequested;
            }

            DbContext.SaveChanges();

            return(Display());
        }