/// <summary>
        /// Executes all queries.
        /// </summary>
        /// <param name="averageActCostBnfCode">The AverageActCostBnfCode BNF code.</param>
        /// <param name="averageActCostPerRegionBnfCode">The AverageActCostPerRegionBnfCode BNF code.</param>
        /// <param name="fractionActCostOfNicByRegionBnfCode">The FractionActCostOfNicByRegionBnfCode BNF code.</param>
        /// <returns></returns>
        public PrescriptionsQueryBatchResult ExecuteAllQueries(
            string averageActCostBnfCode,
            string averageActCostPerRegionBnfCode,
            string fractionActCostOfNicByRegionBnfCode)
        {
            // Create a query batch
            var batch = new PrescriptionsQueryBatch();

            // Add all the required queries to this one batch
            // For GetAverageActCost()
            batch.TryAdd(queryFactory.CalcAvgCostByCode(averageActCostBnfCode));
            // For GetTotalSpendPerPostcode()
            batch.TryAdd(queryFactory.CalcTotalSpendPerPostcode(practices));
            GetCalcAvgCostByCodeByRegionQueriesForAllRegions(averageActCostPerRegionBnfCode).ForEach(q => batch.TryAdd(q));
            // For GetAverageActCostPerRegion()
            batch.TryAdd(queryFactory.CalcAvgCostByCode(averageActCostPerRegionBnfCode));
            // For GetFractionActCostOfNicByRegion()
            PopulateQueryBatchForActCostNicFractionByRegion(batch, fractionActCostOfNicByRegionBnfCode);

            // Execute the queries using the reader
            prescriptionsReader.ExecuteQuery(batch);

            // Create container to return results
            var results = new PrescriptionsQueryBatchResult();

            // Add results to the return object
            results.GetAverageActCostResults.Add(averageActCostBnfCode, batch.GetCalcAvgCostByCode(averageActCostBnfCode).Result);
            results.GetTotalSpendPerPostcodeResults = batch.GetCalcTotalSpendPerPostcode().Result;
            results.GetAverageActCostResults.Add(averageActCostPerRegionBnfCode, batch.GetCalcAvgCostByCode(averageActCostPerRegionBnfCode).Result);
            Region.All.ForEach(r =>
                results.GetAverageActCostPerRegionResults.Add(
                    r,
                    batch.GetCalcAvgCostByCodeByRegion(r, averageActCostPerRegionBnfCode).Result));
            Region.All.ForEach(r =>
                results.GetFractionActCostOfNicByRegionResults.Add(
                    r,
                    batch.GetCalcTotalActCostByCodeByRegion(r, fractionActCostOfNicByRegionBnfCode).Result
                    / batch.GetCalcTotalNicByCodeByRegion(r, fractionActCostOfNicByRegionBnfCode).Result));

            // Return 
            return results;
        }
        /// <summary>
        /// Gets the average Actual Cost as a decimal fraction of the average NIC for each region.
        /// </summary>
        /// <param name="bnfCode">The BNF code.</param>
        /// <returns>A fraction for each region.</returns>
        public Dictionary<Region, decimal> GetFractionActCostOfNicByRegion(string bnfCode)
        {
            // Get region count
            int regionCount = Region.All.Count;

            // Create new batch of queries to send to reader
            var queryBatch = new PrescriptionsQueryBatch();

            // Get the queries
            PopulateQueryBatchForActCostNicFractionByRegion(queryBatch, bnfCode);

            // Execute the queries using the reader
            prescriptionsReader.ExecuteQuery(queryBatch);

            // Calculate return dictionary
            var result = new Dictionary<Region, decimal>(regionCount);
            Region.All.ForEach(
                r =>
                result.Add(
                    r,
                    queryBatch.GetCalcTotalActCostByCodeByRegion(r, bnfCode).Result
                    / queryBatch.GetCalcTotalNicByCodeByRegion(r, bnfCode).Result));

            return result;
        }