protected DomainObject AbstractFindSingleWithParameterSource(Type type, ParameterSource parameterSource)
        {
            // Check identity map.
            DomainObject result = identityMap.GetDomainObject(type, parameterSource.UniqueId);

            if (result != null)
            {
                return(result);
            }

            // Identity map not hit, do query.
            using (DbConnection connection = providerFactory.CreateConnection())
            {
                connection.ConnectionString = DbSettings.ConnectionString;
                connection.Open();

                DbCommand command = providerFactory.CreateCommand();
                command.Connection  = connection;
                command.CommandText = FindSingleStatement();      // Find single, implement by derived class.

                foreach (Criterion criterion in parameterSource.GetAllCriteria())
                {
                    DbParameter parameter = providerFactory.CreateParameter();
                    parameter.ParameterName = criterion.ParamName;
                    parameter.DbType        = criterion.ParamType;
                    parameter.Value         = criterion.ParamValue;
                    command.Parameters.Add(parameter);
                }

                DbDataReader reader = command.ExecuteReader();
                reader.Read();

                int AffectedRows = reader.RecordsAffected;
                Console.WriteLine("Find() RowsAffected: {0}", AffectedRows);

                DomainObject domainObject = Load(type, parameterSource.UniqueId, (IDataRecord)reader);

                return(domainObject);
            }
        }
        protected IList <DomainObject> AbstractFindManyWithParameterSource(Type type, ParameterSource parameterSource)
        {
            using (DbConnection connection = providerFactory.CreateConnection())
            {
                connection.ConnectionString = DbSettings.ConnectionString;
                connection.Open();

                DbCommand command = providerFactory.CreateCommand();
                command.Connection  = connection;
                command.CommandText = FindManyStatement();      // Find many, implement by derived class.

                foreach (Criterion criterion in parameterSource.GetAllCriteria())
                {
                    DbParameter parameter = providerFactory.CreateParameter();
                    parameter.ParameterName = criterion.ParamName;
                    parameter.DbType        = criterion.ParamType;
                    parameter.Value         = criterion.ParamValue;
                    command.Parameters.Add(parameter);
                }

                DbDataReader reader       = command.ExecuteReader();
                int          AffectedRows = reader.RecordsAffected;
                Console.WriteLine("Find() RowsAffected: {0}", AffectedRows);

                IList <DomainObject> results = new List <DomainObject>();

                while (reader.Read())
                {
                    string       UniqueId = GetUniqueId((IDataRecord)reader);
                    DomainObject item     = Load(type, UniqueId, (IDataRecord)reader);
                    results.Add(item);
                }

                return(results);
            }
        }