/// <summary>
        /// Synchronously execute the given query expected to return 0 or 1 items.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        /// <returns></returns>
        public T ExecuteSingleQuery <T>(IComplexDataQuery <T> query)
        {
            using (var cn = new SqlConnection(this.connectionString))
            {
                var cmd = query.ConstructCommand(cn);
                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection | query.GetCustomCommandBehaviors(cn, cmd)))
                {
                    T row = query.Retrieve(cmd, dr);

                    return(row);
                }
            }
        }
        /// <summary>
        /// Asynchronously execute the given query expected to return 0 or more rows.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        /// <param name="expectedCapacity"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task <T> ExecuteListQueryAsync <T>(IComplexDataQuery <T> query, int expectedCapacity = 10, TaskFactory <T> factory = null)
        {
            if (expectedCapacity < 0)
            {
                expectedCapacity = 0;
            }
            if (factory == null)
            {
                factory = new TaskFactory <T>();
            }

            using (var cn = new SqlConnection(this.connectionString))
            {
                var cmd = query.ConstructCommand(cn);
                cn.Open();

                using (SqlDataReader dr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection | query.GetCustomCommandBehaviors(cn, cmd)))
                {
                    return(await query.RetrieveAsync(cmd, dr, expectedCapacity));
                }
            }
        }
        /// <summary>
        /// Asynchronously execute the given query expected to return 0 or 1 items.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        /// <param name="factory"></param>
        /// <returns></returns>
        public async Task <T> ExecuteSingleQueryAsync <T>(IComplexDataQuery <T> query, TaskFactory <T> factory = null)
        {
            if (factory == null)
            {
                factory = new TaskFactory <T>();
            }

            using (var cn = new SqlConnection(this.connectionString))
            {
                var cmd = query.ConstructCommand(cn);
                cn.Open();

                using (SqlDataReader dr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection | query.GetCustomCommandBehaviors(cn, cmd)))
                {
                    T row = await query.RetrieveAsync(cmd, dr);

                    return(row);
                }
            }
        }