internal static Task <List <T> > ExprConvertToListAsync <T>(this IDataReader dataReader, CancellationToken token)
        {
            var fieldDefs       = ModelDefinition <T> .Definition.AllFieldDefinitionsArray;
            var dialectProvider = OrmLiteConfig.DialectProvider;

            using (dataReader)
            {
                var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition <T> .Definition);

                return(dialectProvider.ReaderEach(dataReader, () => {
                    var row = OrmLiteUtilExtensions.CreateInstance <T>();
                    row.PopulateWithSqlReader(dataReader, fieldDefs, indexCache);
                    return row;
                }, token));
            }
        }
        //internal static List<T> LoadSelectAsync<T>(this IDbCommand dbCmd, Func<SqlExpression<T>, SqlExpression<T>> expression)
        //{
        //    var expr = OrmLiteConfig.DialectProvider.SqlExpression<T>();
        //    expr = expression(expr);
        //    return dbCmd.LoadListWithReferencesAsync<T, T>(expr);
        //}

        //internal static List<T> LoadSelectAsync<T>(this IDbCommand dbCmd, SqlExpression<T> expression, CancellationToken token)
        //{
        //    return dbCmd.LoadListWithReferencesAsync<T, T>(expression);
        //}

        //internal static List<Into> LoadSelectAsync<Into, From>(this IDbCommand dbCmd, SqlExpression<From> expression, CancellationToken token)
        //{
        //    return dbCmd.LoadListWithReferencesAsync<Into, From>(expression);
        //}

        //internal static List<T> LoadSelectAsync<T>(this IDbCommand dbCmd, Expression<Func<T, bool>> predicate, CancellationToken token)
        //{
        //    var expr = OrmLiteConfig.DialectProvider.SqlExpression<T>().Where(predicate);
        //    return dbCmd.LoadListWithReferencesAsync<T, T>(expr);
        //}

        internal static Task <T> ExprConvertToAsync <T>(this IDataReader dataReader, CancellationToken token)
        {
            var fieldDefs       = ModelDefinition <T> .Definition.AllFieldDefinitionsArray;
            var dialectProvider = OrmLiteConfig.DialectProvider;

            using (dataReader)
            {
                return(dialectProvider.ReaderRead(dataReader, () =>
                {
                    var row = OrmLiteUtilExtensions.CreateInstance <T>();
                    var namingStrategy = OrmLiteConfig.DialectProvider.NamingStrategy;
                    for (int i = 0; i < dataReader.FieldCount; i++)
                    {
                        var fieldDef = fieldDefs.FirstOrDefault(x =>
                                                                namingStrategy.GetColumnName(x.FieldName).ToUpper() == dataReader.GetName(i).ToUpper());

                        dialectProvider.SetDbValue(fieldDef, dataReader, i, row);
                    }
                    return row;
                }, token));
            }
        }