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)); }
/// <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)); }
/// <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)); }
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)); }
/// <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()); }
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()); }
/// <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()); }