/// <summary>
        /// Updates the list of stocks in the database by adding new stocks from the list of current stocks and
        /// by deleting stocks that are no longer listed in the list of current stocks.
        /// </summary>
        /// <param name="currentStocks">The current stocks.</param>
        public void MakeDbStockListCurrent(List<Stock> currentStocks)
        {
            foreach (var stock in currentStocks)
            {
                try
                {
                    using (var context = new StockScreenerEntities())
                    {
                        if (context.Stocks.Any(s => s.Ticker.Equals(stock.Ticker)))
                        {
                            var stockToUpdate = context.Stocks.First(s => s.Ticker.Equals(stock.Ticker));
                            if (!stockToUpdate.CompanyName.Equals(stock.CompanyName))
                            {
                                Console.WriteLine("Updating " + stock.Ticker + ":  " + stockToUpdate.CompanyName + " to " + stock.CompanyName);

                                stockToUpdate.CompanyName = stock.CompanyName;
                                context.SaveChanges();
                            }
                        }
                        else
                        {
                            context.Stocks.AddObject(stock);
                            context.SaveChanges();

                            Console.WriteLine("Added " + stock.Exchange + ":" + stock.Ticker);
                        }
                    }
                }
                catch (UpdateException ex)
                {
                    if (string.IsNullOrEmpty(ex.InnerException.Message) || !ex.InnerException.Message.Contains("Cannot insert duplicate key"))
                    {
                        throw;
                    }
                }
            }

            this.PruneStocksInDb(currentStocks);
        }
        /// <summary>
        /// Creates a new watch list.
        /// </summary>
        private void CreateWatchList()
        {
            // First, display a list of existing watch lists.
            this.DisplayWatchLists();

            // Prompt the user to enter a name for the new watch list.
            Console.Write("Enter new watch list name ([Blank] to cancel) -->  ");
            var name = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(name))
            {
                // The user opted to cancel without entering a name.
                Console.WriteLine();
                return;
            }

            // Prompt the user to confirm the inputted name.
            Console.Write("Create watch list named '" + name + "'?  (Y/N) -->  ");
            var isConfirmed = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(isConfirmed) || !isConfirmed.ToUpper().Equals("Y"))
            {
                // The user did not confirm the name.
                Console.WriteLine("Watch list not created.");
                Console.WriteLine();
                return;
            }

            // Create a new entry in the database using the inputted name.
            using (var context = new StockScreenerEntities())
            {
                try
                {
                    context.Watchlists.AddObject(new Watchlist { Name = name });
                    context.SaveChanges();
                    Console.WriteLine("Watch list was created.");
                    Console.WriteLine();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
        /// <summary>
        /// Deletes a watch list.
        /// </summary>
        private void DeleteWatchList()
        {
            // First, display a list of available watch lists.
            this.DisplayWatchLists();

            // Prompt the user to enter the watch list that will be deleted.
            Console.Write("Select ID of watch list to delete. ([Blank] to cancel.) -->  ");
            var input = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(input))
            {
                // The user opted to cancel without entering an ID.
                Console.WriteLine();
                return;
            }

            int id;
            if (!int.TryParse(input, out id))
            {
                // Invalid Input -- non-numeric data!!!
                Console.WriteLine("Invalid input...no watch list was deleted.");
                Console.WriteLine();
                return;
            }

            using (var context = new StockScreenerEntities())
            {
                try
                {
                    var watchLists = context.Watchlists.ToList();

                    if (watchLists.Count(list => list.ID == id) <= 0)
                    {
                        // Invalid Input -- Invalid watch list ID!!!
                        Console.WriteLine("Invalid input...no watch list was deleted.");
                        Console.WriteLine();
                        return;
                    }

                    // Delete the selected ID from the database.
                    var listToDelete = watchLists.First(list => list.ID == id);
                    context.Watchlists.DeleteObject(listToDelete);
                    context.SaveChanges();
                    Console.WriteLine("Watch list was deleted.");
                    Console.WriteLine();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
 /// <summary>
 /// Prunes the stocks in the DB by removing all stocks that are not in the list of current stocks.
 /// </summary>
 /// <param name="currentStocks">The list of current stocks that should remain in the DB.</param>
 private void PruneStocksInDb(IEnumerable<Stock> currentStocks)
 {
     using (var context = new StockScreenerEntities())
     {
         var databaseStocks = context.Stocks.ToList();
         foreach (var stock in databaseStocks.Where(stock => currentStocks.Count(list => list.Ticker.Equals(stock.Ticker)) <= 0))
         {
             try
             {
                 context.Stocks.DeleteObject(stock);
                 context.SaveChanges();
                 Console.WriteLine("Removed " + stock.Exchange + ":" + stock.Ticker);
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex);
             }
         }
     }
 }
        /// <summary>
        /// Updates the daily stock data in database.
        /// </summary>
        /// <param name="dailies">The daily data to insert into the database.</param>
        private static void UpdateDailiesInDatabase(IEnumerable<StockDaily> dailies)
        {
            using (var context = new StockScreenerEntities())
            {
                foreach (var daily in dailies)
                {
                    context.StockDailies.AddObject(daily);
                }

                var numRecords = context.SaveChanges();

                Console.WriteLine("Inserted " + numRecords + " records.");
            }
        }