/// <summary>
 /// Executes a select query using a DataAdapter and returns data using the provided data reader extractor.
 /// </summary>
 /// <typeparam name="T">&nbsp;the type of the data to return</typeparam>
 /// <param name="query">the parsed query</param>
 /// <param name="extractor">the data reader mapper used to extract data</param>
 /// <param name="parameterSource">a parameter source that holds the parameter values for the query</param>
 /// <returns>the extracted data</returns>
 public T Select<T>(ParsedQuery query, DataReaderExtractor<T> extractor, IQueryParameterSource parameterSource = null)
 {
     var table = new DataTable();
     using (var dataAdapter = ConnectionProvider.ProviderFactory.CreateDataAdapter())
     using (var command = GetCommand(query.SubstitutedQuery))
     {
         dataAdapter.SelectCommand = command;
         SetParameters(command, query, parameterSource);
         dataAdapter.Fill(table);
     }
     return extractor(new DataTableReader(table));
 }
 /// <summary>
 /// Executes a select query using a DataAdapter and returns data using the provided data reader extractor.
 /// </summary>
 /// <typeparam name="T">&nbsp;the type of the data to return</typeparam>
 /// <param name="query">the SQL query</param>
 /// <param name="extractor">the data reader mapper used to extract data</param>
 /// <param name="parameterSource">a parameter source that holds the parameter values for the query</param>
 /// <returns>the extracted data</returns>
 public T Select<T>(string query, DataReaderExtractor<T> extractor, IQueryParameterSource parameterSource = null)
 {
     var parsedQuery = new ParsedQuery(query, ConnectionProvider.PlaceholderGetter);
     return Select(parsedQuery, extractor, parameterSource);
 }
 /// <summary>
 /// Executes a select query using a DataAdapter and returns data using the provided data reader extractor.
 /// </summary>
 /// <typeparam name="T">&nbsp;the type of the data to return</typeparam>
 /// <param name="query">the SQL query</param>
 /// <param name="extractor">the data reader mapper used to extract data</param>
 /// <param name="parameters">the parameters of the query</param>
 /// <returns>the extracted data</returns>
 public T Select<T>(string query, DataReaderExtractor<T> extractor, IDictionary<string, object> parameters)
 {
     return Select(query, extractor, new DictionaryParameterSource { Parameters = parameters });
 }