public Document Get(Guid id)
        {
            var row = _databaseGateway.GetSingleRowUsing(_queryFactory.Get(id));

            row.GuardAgainstRecordNotFound <Document>(id);

            var result = new Document(
                Columns.Id.MapFrom(row),
                Columns.ReferenceId.MapFrom(row),
                Columns.FileName.MapFrom(row),
                Columns.ContentType.MapFrom(row),
                Columns.Content.MapFrom(row),
                Columns.SystemName.MapFrom(row),
                Columns.Username.MapFrom(row),
                Columns.EffectiveFromDate.MapFrom(row)
                );

            var sanitizedContent = Columns.SanitizedContent.MapFrom(row);

            if (sanitizedContent != null && sanitizedContent.Length > 0)
            {
                result.WithSanitizedContent(sanitizedContent);
            }

            foreach (var statusEventRow in _databaseGateway.GetRowsUsing(_queryFactory.GetStatusEvents(id)))
            {
                result.OnStatusEvent(
                    (ServiceStatus)Enum.Parse(typeof(ServiceStatus), Columns.Status.MapFrom(statusEventRow)),
                    Columns.DateRegistered.MapFrom(statusEventRow));
            }

            foreach (var propertyRow in _databaseGateway.GetRowsUsing(_queryFactory.GetProperties(id)))
            {
                result.SetProperty(Columns.Name.MapFrom(propertyRow), Columns.Value.MapFrom(propertyRow));
            }

            return(result);
        }
        public IEnumerable <Query.Document> Search(Query.Document.Specification specification)
        {
            Guard.AgainstNull(specification, nameof(specification));

            var result = _queryMapper.MapObjects <Query.Document>(_queryFactory.Search(specification))
                         .ToDictionary(document => document.Id);

            if (specification.StatusEventsIncluded && result.Any())
            {
                foreach (var mappedRow in _queryMapper.MapRows <Query.Document.StatusEvent>(_queryFactory.GetStatusEvents(result.Keys)))
                {
                    if (result.TryGetValue(Columns.DocumentId.MapFrom(mappedRow.Row), out var document))
                    {
                        document.StatusEvents.Add(mappedRow.Result);
                    }
                }
            }

            if (specification.PropertiesIncluded && result.Any())
            {
                foreach (var mappedRow in _queryMapper.MapRows <Query.Document.Property>(query: _queryFactory.GetProperties(result.Keys)))
                {
                    if (result.TryGetValue(Columns.DocumentId.MapFrom(mappedRow.Row), out var document))
                    {
                        document.Properties.Add(mappedRow.Result);
                    }
                }
            }

            return(result.Values);
        }