internal static List <DataReaderRow> GetDataReaderRows(this IDataReader dataReader, Dictionary <Type, int> columnsWithSkipCount)
        {
            var dataReaderRows = new List <DataReaderRow>();
            var columnNames    = new List <string>();

            for (var i = 0; i < dataReader.FieldCount; i++)
            {
                var fieldName = dataReader.GetName(i).ReplaceFirst("_", ".");
                columnNames.Add(fieldName);
            }
            while (columnsWithSkipCount.Any(x => x.Value == -1))
            {
                var item = columnsWithSkipCount.First(x => x.Value == -1);
                columnsWithSkipCount[item.Key] = columnNames.FindIndex(x => x.StartsWith(item.Key.Name + "."));
            }

            while (dataReader.Read())
            {
                var row = new DataReaderRow();

                for (var i = 0; i < columnNames.Count; i++)
                {
                    var c = columnNames[i];
                    row[c] = dataReader[i] ?? DBNull.Value;
                }
                dataReaderRows.Add(row);
            }

            return(dataReaderRows);
        }
        internal static List <DataReaderRow> GetDataReaderRows(this IDataReader dataReader, string[] columnNames, string typeName, DotEntityDbCommand command)
        {
            Throw.IfArgumentNullOrEmpty(typeName, nameof(typeName));
            var dataReaderRows   = new List <DataReaderRow>();
            var ordinalsCaptured = ProcessedQueryCache.TryGet(command.Query, out Dictionary <string, int> columnOrdinals);

            while (dataReader.Read())
            {
                if (!ordinalsCaptured)
                {
                    ordinalsCaptured = true;
                    columnOrdinals   = columnOrdinals ?? new Dictionary <string, int>();
                    //the microsoft sqlite reader's get ordinal performs case sensitive comparision, we'll have to lower case the columns in the case
                    var doLower = typeName == "SqliteMaster" && dataReader.GetType().FullName == "Microsoft.Data.Sqlite.SqliteDataReader";
                    foreach (var c in columnNames)
                    {
                        columnOrdinals.Add(typeName + "." + c, dataReader.GetOrdinal(doLower ? c.ToLowerInvariant() : c));
                    }
                    ProcessedQueryCache.TrySet(command.Query, columnOrdinals);
                }
                var row = new DataReaderRow();
                foreach (var c in columnOrdinals)
                {
                    row[c.Key] = dataReader[c.Value];
                }
                dataReaderRows.Add(row);
            }

            return(dataReaderRows);
        }
        internal static List <List <DataReaderRow> > GetRawDataReaderRows(this IDataReader dataReader)
        {
            var dataReaderRows = new List <List <DataReaderRow> >();
            var hasResultSet   = true;
            var resultIndex    = 0;

            while (hasResultSet)
            {
                var      newList     = new List <DataReaderRow>();
                string[] columnNames = null;
                try
                {
                    columnNames = GetColumnNames(dataReader);
                }
                catch
                {
                    //we'll have to manually do something-----------------------------------------
                }                                           //|
                while (dataReader.Read())                   //|
                {                                           //|
                    var fieldCount = dataReader.FieldCount; //|
                    var row        = new DataReaderRow();   //|
                    if (columnNames == null)                //<--------------------------------------------------
                    {
                        columnNames = new string[fieldCount];
                        for (var i = 0; i < fieldCount; i++)
                        {
                            columnNames[i] = dataReader.GetName(i);
                        }
                    }

                    foreach (var c in columnNames)
                    {
                        row[c] = dataReader[c];
                    }


                    newList.Add(row);
                }
                dataReaderRows.Add(newList);
                hasResultSet = dataReader.NextResult();
            }
            return(dataReaderRows);
        }