IEnumerable <T> Project <T>(IDataReader reader, Func <FieldReader, T> fnProjector)
        {
            var items   = new List <T>();
            var freader = new FieldReader(reader);

            while (reader.Read())
            {
                T item = default(T);
                try
                {
                    item = fnProjector(freader);
                    items.Add(item);
                }
                catch (Exception ex)
                {
                    var exceptionContext = new DbExceptionContextInfo
                    {
                        SqlException = new ProjectionException(ex.Message, ex),
                        //Message = "data bind exception.",
                        Message = ex.Message,
                    };
                    throw ExceptionHelper.Convert(log, exceptionConverter, exceptionContext);
                }
                finally
                {
                }
            }


            return(items);
        }
        IEnumerable <T> ExecuteBatch <T>(string commandText, NamedParameter[] parameters, IEnumerable <object[]> paramSets, Func <FieldReader, T> fnProjector)
        {
            //log.AddMessage("开始时间:"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
            //log.AddCommand(commandText, parameters, null);

            var       cmdSql        = string.Empty;
            var       cmdParameters = string.Empty;
            Exception err           = null;
            var       items         = new List <T>();

            try
            {
                using (DbCommand cmd = this.GetCommand(commandText, parameters, null))
                {
                    cmdSql = cmd.CommandText;

                    cmdParameters = paramSets.JsonSerialize();
                    foreach (var paramValues in paramSets)
                    {
                        cmd.Parameters.Clear();
                        SetParameterValues(parameters, cmd, paramValues);

                        using (var reader = cmd.ExecuteReader())
                        {
                            var freader = new FieldReader(reader);
                            if (reader.Read())
                            {
                                items.Add(fnProjector(freader));
                            }
                            else
                            {
                                items.Add(default(T));
                            }
                        }
                    }
                }
            }
            catch (ConnectionException ex)
            {
                err = ex;
                throw;
            }
            catch (DBConcurrencyException ex)
            {
                err = ex;
                throw;
            }
            catch (Exception ex)
            {
                err = ex;
                var exceptionContext = new DbExceptionContextInfo
                {
                    Sql          = commandText,
                    SqlException = new PersistenceException(ex.Message, ex),
                };
                throw ExceptionHelper.Convert(log, exceptionConverter, exceptionContext);
            }
            finally
            {
                LogSql(err, cmdSql, cmdParameters);
            }

            return(items);
        }