protected override Task <IEnumerable <RelationshipEntityInstanceIdentity <TMainEntity> > > QueryAsync(
            IDbConnection connection,
            string statement,
            string splitOnCondition,
            object parameters,
            bool buffered,
            IDbTransaction transaction,
            int?commandTimeout,
            RelationshipEntityInstanceBuilder relationshipInstanceBuilder)
        {
            return(connection.QueryAsync <TMainEntity, TFirstJoinedEntity, TSecondJoinedEntity, TThirdJoinedEntity, TFourthJoinedEntity, RelationshipEntityInstanceIdentity <TMainEntity> >(
                       statement,
                       (mainEntity, firstJoinedEntity, secondJoinedEntity, thirdJoinedEntity, fourthJoinedEntity) =>
            {
                var mainEntityIdentity = relationshipInstanceBuilder.RegisterResultSetRowInstance(mainEntity);
                relationshipInstanceBuilder.RegisterResultSetRowInstance(firstJoinedEntity);
                relationshipInstanceBuilder.RegisterResultSetRowInstance(secondJoinedEntity);
                relationshipInstanceBuilder.RegisterResultSetRowInstance(thirdJoinedEntity);
                relationshipInstanceBuilder.RegisterResultSetRowInstance(fourthJoinedEntity);
                relationshipInstanceBuilder.EndResultSetRow();

                return mainEntityIdentity;
            },
                       parameters,
                       buffered: buffered,
                       splitOn: splitOnCondition,
                       transaction: transaction,
                       commandTimeout: commandTimeout));
        }
Esempio n. 2
0
        /// <summary>
        /// Performs a common SELECT
        /// </summary>
        public async Task <IEnumerable <TEntity> > BatchSelectAsync(IDbConnection connection, AggregatedSqlStatementOptions <TEntity> statementOptions)
        {
            //validation removed, up to the engine to fail
            //Requires.Argument((statementOptions.LimitResults == null && statementOptions.SkipResults == null) || (statementOptions.OrderClause != null || statementOptions.RelationshipOptions.Values.Any(singleJoinOptions => singleJoinOptions.OrderClause != null)), nameof(statementOptions),
            //    "When using Top or Skip, you must provide an OrderBy clause.");

            string statement;
            string splitOnCondition;

            this.SqlBuilder.ConstructFullJoinSelectStatement(
                out statement,
                out splitOnCondition,
                this.ConstructJoinInstructions(statementOptions, _joinedEntitiesSqlBuilders),
                whereClause: statementOptions.WhereClause,
                orderClause: statementOptions.OrderClause,
                skipRowsCount: statementOptions.SkipResults,
                limitRowsCount: statementOptions.LimitResults);

            var relationshipInstanceBuilder = new RelationshipEntityInstanceBuilder(_allEntityMappings);

            var queriedEntityIdentities = await this.QueryAsync(connection,
                                                                statement,
                                                                splitOnCondition,
                                                                statementOptions.Parameters,
                                                                !statementOptions.ForceStreamResults,
                                                                statementOptions.Transaction,
                                                                (int?)statementOptions.CommandTimeout?.TotalSeconds,
                                                                relationshipInstanceBuilder);

            // a problem in the Dapper library would cause this function to fail
            // see https://github.com/StackExchange/dapper-dot-net/issues/596 for more info
            return(this.FilterDuplicates(queriedEntityIdentities));
        }
Esempio n. 3
0
        /// <summary>
        /// Performs a common SELECT
        /// </summary>
        public IEnumerable <TEntity> BatchSelect(IDbConnection connection, AggregatedSqlStatementOptions <TEntity> statementOptions)
        {
            //validation removed, up to the engine to fail
            //Requires.Argument((statementOptions.LimitResults == null && statementOptions.SkipResults == null) || (statementOptions.OrderClause != null || statementOptions.RelationshipOptions.Values.Any(singleJoinOptions => singleJoinOptions.OrderClause != null)), nameof(statementOptions),
            //    "When using Top or Skip, you must provide an OrderBy clause.");

            string statement;
            string splitOnCondition;

            this.SqlBuilder.ConstructFullJoinSelectStatement(
                out statement,
                out splitOnCondition,
                this.ConstructJoinInstructions(statementOptions, _joinedEntitiesSqlBuilders),
                whereClause: statementOptions.WhereClause,
                orderClause: statementOptions.OrderClause,
                skipRowsCount: statementOptions.SkipResults,
                limitRowsCount: statementOptions.LimitResults);

            var relationshipInstanceBuilder = new RelationshipEntityInstanceBuilder(_allEntityMappings);

            var queriedEntityIdentities = this.Query(connection,
                                                     statement,
                                                     splitOnCondition,
                                                     statementOptions.Parameters,
                                                     !statementOptions.ForceStreamResults,
                                                     statementOptions.Transaction,
                                                     (int?)statementOptions.CommandTimeout?.TotalSeconds,
                                                     relationshipInstanceBuilder);

            return(this.FilterDuplicates(queriedEntityIdentities));
        }
Esempio n. 4
0
        protected override IEnumerable <TMainEntity> Query(
            IDbConnection connection,
            string statement,
            string splitOnCondition,
            object parameters,
            bool buffered,
            IDbTransaction transaction,
            int?commandTimeout,
            RelationshipEntityInstanceBuilder relationshipInstanceBuilder)
        {
            return(connection.Query <TMainEntity, TFirstJoinedEntity, TMainEntity>(
                       statement,
                       (mainEntity, joinedEntity) =>
            {
                relationshipInstanceBuilder.RegisterResultSetRowInstance(ref mainEntity);
                relationshipInstanceBuilder.RegisterResultSetRowInstance(ref joinedEntity);
                relationshipInstanceBuilder.EndResultSetRow();

                return mainEntity;
            },
                       parameters,
                       buffered: buffered,
                       splitOn: splitOnCondition,
                       transaction: transaction,
                       commandTimeout: commandTimeout));
        }
Esempio n. 5
0
        /// <summary>
        ///     Performs a SELECT operation on a single entity, using its keys
        /// </summary>
        public async Task <TEntity> SelectByIdAsync(IDbConnection connection, TEntity keyEntity,
                                                    AggregatedSqlStatementOptions <TEntity> statementOptions)
        {
            string statement;
            string splitOnCondition;

            SqlBuilder.ConstructFullJoinSelectStatement(
                out statement,
                out splitOnCondition,
                ConstructJoinInstructions(statementOptions, _joinedEntitiesSqlBuilders),
                whereClause: $"{SqlBuilder.ConstructKeysWhereClause(SqlBuilder.GetTableName())}");

            var relationshipInstanceBuilder = new RelationshipEntityInstanceBuilder(_allEntityMappings);
            var queriedEntityIdentities     = await QueryAsync(connection,
                                                               statement,
                                                               splitOnCondition,
                                                               keyEntity,
                                                               false,
                                                               statementOptions.Transaction,
                                                               (int?)statementOptions.CommandTimeout?.TotalSeconds, relationshipInstanceBuilder);

            // a problem in the Dapper library would cause this function to fail
            // see https://github.com/StackExchange/dapper-dot-net/issues/596 for more info
            return(FilterDuplicates(queriedEntityIdentities).SingleOrDefault());
        }
Esempio n. 6
0
 protected abstract Task <IEnumerable <RelationshipEntityInstanceIdentity <TEntity> > > QueryAsync(
     IDbConnection connection,
     string statement,
     string splitOnCondition,
     object parameters,
     bool buffered,
     IDbTransaction transaction,
     int?commandTimeout,
     RelationshipEntityInstanceBuilder relationshipInstanceBuilder);
        /// <summary>
        /// Performs a SELECT operation on a single entity, using its keys
        /// </summary>
        public async Task <TEntity> SelectByIdAsync(IDbConnection connection, TEntity keyEntity, AggregatedSqlStatementOptions <TEntity> statementOptions)
        {
            string statement;
            string splitOnCondition;

            this.SqlBuilder.ConstructFullJoinSelectStatement(
                out statement,
                out splitOnCondition,
                this.ConstructJoinInstructions(statementOptions, _joinedEntitiesSqlBuilders),
                whereClause: $"{this.SqlBuilder.ConstructKeysWhereClause(this.SqlBuilder.GetTableName())}");

            var relationshipInstanceBuilder = new RelationshipEntityInstanceBuilder(_allEntityMappings);

            return((await this.QueryAsync(connection,
                                          statement,
                                          splitOnCondition,
                                          keyEntity,
                                          false,
                                          statementOptions.Transaction,
                                          (int?)statementOptions.CommandTimeout?.TotalSeconds, relationshipInstanceBuilder)).SingleOrDefault());
        }
Esempio n. 8
0
        /// <summary>
        ///     Performs a SELECT operation on a single entity, using its keys
        /// </summary>
        public TEntity SelectById(IDbConnection connection, TEntity keyEntity,
                                  AggregatedSqlStatementOptions <TEntity> statementOptions)
        {
            string statement;
            string splitOnCondition;

            SqlBuilder.ConstructFullJoinSelectStatement(
                out statement,
                out splitOnCondition,
                ConstructJoinInstructions(statementOptions, _joinedEntitiesSqlBuilders),
                whereClause: $"{SqlBuilder.ConstructKeysWhereClause(SqlBuilder.GetTableName())}");

            var relationshipInstanceBuilder = new RelationshipEntityInstanceBuilder(_allEntityMappings);
            var queriedEntityIdentities     = Query(connection,
                                                    statement,
                                                    splitOnCondition,
                                                    keyEntity,
                                                    false,
                                                    statementOptions.Transaction,
                                                    (int?)statementOptions.CommandTimeout?.TotalSeconds, relationshipInstanceBuilder);

            return(FilterDuplicates(queriedEntityIdentities).SingleOrDefault());
        }