public virtual async Task <List <ISqlTransactionalOutboxItem <TUniqueIdentifier> > > RetrieveOutboxItemsAsync(
            OutboxItemStatus status,
            int maxBatchSize = -1
            )
        {
            var statusParamName = OutboxTableConfig.StatusFieldName;
            var sql             = QueryBuilder.BuildSqlForRetrieveOutboxItemsByStatus(status, maxBatchSize, statusParamName);

            await using var sqlCmd = CreateSqlCommand(sql);
            AddParam(sqlCmd, statusParamName, status.ToString(), SqlDbType.VarChar);

            var results = new List <ISqlTransactionalOutboxItem <TUniqueIdentifier> >();

            await using var sqlReader = await sqlCmd.ExecuteReaderAsync().ConfigureAwait(false);

            while (await sqlReader.ReadAsync().ConfigureAwait(false))
            {
                var createdDateUtcFromDb = (DateTime)sqlReader[OutboxTableConfig.CreatedDateTimeUtcFieldName];

                var outboxItem = OutboxItemFactory.CreateExistingOutboxItem(
                    uniqueIdentifier: ConvertUniqueIdentifierFromDb(sqlReader),
                    status: sqlReader[OutboxTableConfig.StatusFieldName] as string,
                    fifoGroupingIdentifier: sqlReader[OutboxTableConfig.FifoGroupingIdentifier] as string,
                    publishAttempts: (int)sqlReader[OutboxTableConfig.PublishAttemptsFieldName],
                    createdDateTimeUtc: new DateTimeOffset(createdDateUtcFromDb, TimeSpan.Zero),
                    publishTarget: sqlReader[OutboxTableConfig.PublishTargetFieldName] as string,
                    serializedPayload: sqlReader[OutboxTableConfig.PayloadFieldName] as string
                    );

                results.Add(outboxItem);
            }

            return(results);
        }
        public virtual async Task IncrementPublishAttemptsForAllItemsByStatusAsync(OutboxItemStatus status)
        {
            var statusParamName = OutboxTableConfig.StatusFieldName;
            var sql             = QueryBuilder.BuildSqlForBulkPublishAttemptsIncrementByStatus(statusParamName);

            await using var sqlCmd = CreateSqlCommand(sql);
            AddParam(sqlCmd, statusParamName, status.ToString(), SqlDbType.VarChar);

            await sqlCmd.ExecuteNonQueryAsync().ConfigureAwait(false);
        }
 public virtual string BuildSqlForRetrieveOutboxItemsByStatus(OutboxItemStatus status, int maxBatchSize = -1, string statusParamName = "status")
 {
     var sql = @$ "
         SELECT {(maxBatchSize > 0 ? string.Concat(" TOP ", maxBatchSize) : " ")}
             {ToSqlFieldName(OutboxTableConfig.UniqueIdentifierFieldName)},