/// <summary>
            ///
            /// </summary>
            /// <param name="reader"></param>
            /// <param name="tableName"></param>
            /// <param name="connection"></param>
            /// <param name="transaction"></param>
            /// <returns></returns>
            internal static async Task <Func <DbDataReader, ExpandoObject> > GetAsync(DbDataReader reader,
                                                                                      string tableName,
                                                                                      IDbConnection connection,
                                                                                      IDbTransaction transaction)
            {
                var result = (Func <DbDataReader, ExpandoObject>)null;
                var key    = GetKey(reader, tableName, connection);

                if (cache.TryGetValue(key, out result) == false)
                {
                    result = await FunctionFactory.CompileDataReaderToExpandoObjectAsync(reader, tableName, connection, transaction);

                    cache.TryAdd(key, result);
                }
                return(result);
            }