public override ITabularFileAdapter CreateFileAdapter(IReadOnlyCollection <string> columnNames)
        {
            ITabularFileAdapter result =
                new CommaDelimitedFileAdapter(
                    this.FilePath,
                    this.ProviderName,
                    columnNames);

            return(result);
        }
        public async Task <IRow[]> Query(IReadOnlyDictionary <string, string> columns)
        {
            if (null == columns)
            {
                throw new ArgumentNullException(nameof(columns));
            }

            string query =
                string.Format(
                    CultureInfo.InvariantCulture,
                    CommaDelimitedFileAdapter.QueryTemplate,
                    this.fileName);

            if (columns.Any())
            {
                IList <KeyValuePair <string, string> > criteria = new List <KeyValuePair <string, string> >(columns.Count);
                foreach (KeyValuePair <string, string> column in columns)
                {
                    string criterionValue = CommaDelimitedFileAdapter.ComposeCriterion(column.Value);
                    KeyValuePair <string, string> criterion =
                        new KeyValuePair <string, string>(column.Key, criterionValue);
                    criteria.Add(criterion);
                }
                IReadOnlyCollection <string> filters =
                    criteria
                    .Select(
                        (KeyValuePair <string, string> item) =>
                        string.Format(
                            CultureInfo.InvariantCulture,
                            CommaDelimitedFileAdapter.FilterTemplate,
                            item.Key,
                            item.Value))
                    .ToArray();
                string filter =
                    string.Join(CommaDelimitedFileAdapter.DelimiterFilter, filters);

                query = string.Concat(query, CommaDelimitedFileAdapter.WhereClausePrefix, filter);
            }

            OleDbCommand commandQuery = null;

            try
            {
                commandQuery = new OleDbCommand(query, this.connection);
                DbDataReader reader = null;
                try
                {
                    reader = await commandQuery.ExecuteReaderAsync();

                    IList <IRow> rows = new List <IRow>();

                    while (reader.Read())
                    {
                        string rowKey = (string)reader[0];
                        Dictionary <string, string> rowColumns =
                            new Dictionary <string, string>(this.headers.Count - 1);
                        for (int indexColumn = 1; indexColumn < this.headers.Count; indexColumn++)
                        {
                            object columnValue = reader[indexColumn];
                            if (null == columnValue)
                            {
                                continue;
                            }

                            string value = columnValue.ToString();
                            if (string.IsNullOrWhiteSpace(value))
                            {
                                continue;
                            }

                            string columnHeader = this.headers.ElementAt(indexColumn);

                            rowColumns.Add(columnHeader, value);
                        }

                        IRow row = new Row(rowKey, rowColumns);
                        rows.Add(row);
                    }

                    IRow[] results = rows.ToArray();
                    return(results);
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                        reader = null;
                    }
                }
            }
            finally
            {
                if (commandQuery != null)
                {
                    commandQuery.Dispose();
                    commandQuery = null;
                }
            }
        }