public ActionResult Index(string birthYear, string state, string previousCpts)
        {
            int year;

            if (string.IsNullOrWhiteSpace(birthYear) ||
                !int.TryParse(birthYear, out year) ||
                string.IsNullOrWhiteSpace(state) ||
                string.IsNullOrWhiteSpace(previousCpts))
            {
                return
                    this.View(
                        new QueryResults
                            {
                                BirthYear = birthYear,
                                CptCodes = previousCpts,
                                Location = state,
                                Results = new TransitionPredictions(new List<TransitionEmissions>())
                            });
            }

            var cacheRepository = new CacheRepository(this.connectionString);
            var results = cacheRepository.GetQueryResults(birthYear, state, previousCpts);

            if (results != null)
            {
                return this.View(results);
            }

            var queryResults = new QueryResultsBuilder(this.connectionString, birthYear, state, previousCpts).Build();
            queryResults.BirthYear = birthYear;
            queryResults.Location = state;
            queryResults.CptCodes = previousCpts;
            cacheRepository.CacheQueryResults(birthYear, state, previousCpts, queryResults);
            return this.View(queryResults);
        }
        public static void Main(string[] args)
        {
            var connectionString = ConfigurationManager.AppSettings[ConnectionString];

            var balanceTuples = new List<BalanceTuple>();

            Console.WriteLine("Starting Calculations...");

            using (var sqlConnection = new SqlConnection(connectionString))
            {
                using (var sqlCommand = new SqlCommand(NewMemberBalancePredictionsSql, sqlConnection))
                {
                    sqlConnection.Open();

                    var reader = sqlCommand.ExecuteReader();

                    while (reader.Read())
                    {
                        balanceTuples.Add(BalanceTuple.Factory(reader));
                    }

                    reader.Close();
                }

                Console.WriteLine("Found " + balanceTuples.Count);
                var iteration = 1;
                foreach (var balanceTuple in balanceTuples)
                {
                    Console.WriteLine("Processing " + iteration + " / " + balanceTuples.Count);
                    iteration++;

                    var queryResults = new QueryResultsBuilder(
                        connectionString,
                        balanceTuple.BirthYear.ToString(CultureInfo.CurrentCulture),
                        balanceTuple.State,
                        balanceTuple.LastCptCode).Build();

                    balanceTuple.RecommendedBalance = queryResults.Results.MinimumSuggestedAmount;
                    double actualBalance;
                    double.TryParse(balanceTuple.CachedBalance, out actualBalance);

                    balanceTuple.SufficientAmount = actualBalance > balanceTuple.RecommendedBalance ? 1 : 0;

                    using (var command = new SqlCommand(UpdateNewMemberBalancePredictionSql, sqlConnection))
                    {
                        command.Parameters.AddWithValue(NewMemberIdParam, balanceTuple.NewMemberId);
                        command.Parameters.AddWithValue(DependentIdParam, balanceTuple.DependentId);
                        command.Parameters.AddWithValue(RecommendedBalanceParam, balanceTuple.RecommendedBalance);
                        command.Parameters.AddWithValue(SufficientAmountParam, balanceTuple.SufficientAmount);
                        command.ExecuteNonQuery();
                    }
                }
            }
        }