public static IList <string> ToCsv([NotNull] this IDataReader dataReader, bool includeHeaderAsFirstRow, char separator = ControlChars.Comma)
        {
            dataReader = dataReader.ArgumentNotNull();

            var convertedRows = new List <string>();

            if (includeHeaderAsFirstRow)
            {
                var sb = new StringBuilder();

                for (var fieldIndex = 0; fieldIndex <= dataReader.FieldCount - 1; fieldIndex++)
                {
                    if (dataReader.GetName(fieldIndex) is not null)
                    {
                        _ = sb.Append(dataReader.GetName(fieldIndex));
                    }

                    if (fieldIndex < dataReader.FieldCount - 1)
                    {
                        _ = sb.Append(separator);
                    }
                }

                convertedRows.Add(sb.ToString());
            }

            while (dataReader.Read())
            {
                var sb = new StringBuilder();

                for (var fieldIndex = 0; fieldIndex <= dataReader.FieldCount - 2; fieldIndex++)
                {
                    if (!dataReader.IsDBNull(fieldIndex))
                    {
                        var value = dataReader.GetValue(fieldIndex).ToString();
                        if (dataReader.GetFieldType(fieldIndex) == typeof(string))
                        {
                            // If double quotes are used in value, ensure each are replaced but 2.
                            if (value.Contains(ControlChars.Backslash, StringComparison.Ordinal))
                            {
                                value = value.Replace("\"", "\"\"", StringComparison.Ordinal);
                            }

                            // If separator are is in value, ensure it is put in double quotes.
                            if (value.Contains(separator, StringComparison.CurrentCulture))
                            {
                                value = $"{Convert.ToString(ControlChars.Backslash, CultureInfo.InvariantCulture)}{value}{ControlChars.Backslash}";
                            }
                        }

                        _ = sb.Append(value);
                    }

                    if (fieldIndex < dataReader.FieldCount - 1)
                    {
                        _ = sb.Append(separator);
                    }
                }

                if (!dataReader.IsDBNull(dataReader.FieldCount - 1))
                {
                    _ = sb.Append(dataReader.GetValue(dataReader.FieldCount - 1).ToString().Replace(separator, ControlChars.Space));
                }

                convertedRows.Add(sb.ToString());
            }

            return(convertedRows);
        }