示例#1
0
        public static CommandEntity FromProperties(IReadOnlyDictionary <string, object> properties,
                                                   RepositoryEntityMetadata metadata)
        {
            properties.GuardAgainstNull(nameof(properties));
            metadata.GuardAgainstNull(nameof(metadata));

            if (!properties.ContainsKey(nameof(Id)) ||
                properties[nameof(Id)] == null)
            {
                throw new InvalidOperationException(
                          "Unable to create a new CommandEntity. There is no 'Id' property in this collection of values.");
            }

            var result = new CommandEntity(properties[nameof(Id)].ToString());

            foreach (var property in properties)
            {
                var propertyType = metadata.GetPropertyType(property.Key, false);
                if (propertyType != null)
                {
                    result.Add(property.Key, property.Value, propertyType);
                }
            }

            return(result);
        }
示例#2
0
        public static CommandEntity FromCommandEntity(IReadOnlyDictionary <string, object> properties,
                                                      RepositoryEntityMetadata metadata)
        {
            properties.GuardAgainstNull(nameof(properties));
            metadata.GuardAgainstNull(nameof(metadata));

            return(FromProperties(properties, metadata));
        }
示例#3
0
        public CommandEntity Retrieve(string containerName, string id, RepositoryEntityMetadata metadata)
        {
            containerName.GuardAgainstNullOrEmpty(nameof(containerName));
            id.GuardAgainstNullOrEmpty(nameof(id));
            metadata.GuardAgainstNull(nameof(metadata));

            var container = EnsureContainer(containerName);

            if (container.Exists(id))
            {
                return(CommandEntity.FromCommandEntity(
                           container.Get(id).FromFileProperties(metadata), metadata));
            }

            return(default);
        public CommandEntity Retrieve(string containerName, string id, RepositoryEntityMetadata metadata)
        {
            containerName.GuardAgainstNullOrEmpty(nameof(containerName));
            id.GuardAgainstNullOrEmpty(nameof(id));
            metadata.GuardAgainstNull(nameof(metadata));

            if (this.containers.ContainsKey(containerName))
            {
                if (this.containers[containerName].ContainsKey(id))
                {
                    return(CommandEntity.FromCommandEntity(
                               this.containers[containerName][id].FromDictionaryProperties(), metadata));
                }
            }

            return(default);
示例#5
0
        public static QueryEntity FromProperties(IReadOnlyDictionary <string, object> properties,
                                                 RepositoryEntityMetadata metadata)
        {
            properties.GuardAgainstNull(nameof(properties));
            metadata.GuardAgainstNull(nameof(metadata));

            var dataEntity = new QueryEntity();

            foreach (var pair in properties)
            {
                var propertyType = metadata.GetPropertyType(pair.Key, false);
                if (propertyType != null)
                {
                    dataEntity.Add(pair.Key, pair.Value, propertyType);
                }
            }

            return(dataEntity);
        }
        public static List <QueryEntity> FetchAllIntoMemory <TQueryableEntity>(this QueryClause <TQueryableEntity> query,
                                                                               IRepository repository,
                                                                               RepositoryEntityMetadata metadata,
                                                                               Func <Dictionary <string, IReadOnlyDictionary <string, object> > > getPrimaryEntities,
                                                                               Func <QueriedEntity, Dictionary <string, IReadOnlyDictionary <string, object> > > getJoinedEntities)
            where TQueryableEntity : IQueryableEntity
        {
            repository.GuardAgainstNull(nameof(repository));
            query.GuardAgainstNull(nameof(query));
            metadata.GuardAgainstNull(nameof(metadata));
            getPrimaryEntities.GuardAgainstNull(nameof(getPrimaryEntities));
            getJoinedEntities.GuardAgainstNull(nameof(getJoinedEntities));

            var take = query.GetDefaultTake(repository);

            if (take == 0)
            {
                return(new List <QueryEntity>());
            }

            var primaryEntities = getPrimaryEntities();

            if (!primaryEntities.HasAny())
            {
                return(new List <QueryEntity>());
            }

            var joinedContainers = query.JoinedEntities
                                   .Where(je => je.Join.Exists())
                                   .ToDictionary(je => je.EntityName, je => new
            {
                Collection   = getJoinedEntities(je),
                JoinedEntity = je
            });

            List <KeyValuePair <string, IReadOnlyDictionary <string, object> > > joinedEntities = null;

            if (!joinedContainers.Any())
            {
                joinedEntities = primaryEntities
                                 .Select(pe => new KeyValuePair <string, IReadOnlyDictionary <string, object> >(pe.Key, pe.Value))
                                 .ToList();
            }
            else
            {
                foreach (var joinedContainer in joinedContainers)
                {
                    var joinedEntity  = joinedContainer.Value.JoinedEntity;
                    var join          = joinedEntity.Join;
                    var rightEntities = joinedContainer.Value.Collection
                                        .ToDictionary(e => e.Key, e => e.Value);

                    joinedEntities = join
                                     .JoinResults(primaryEntities, rightEntities,
                                                  joinedEntity.Selects.ProjectSelectedJoinedProperties());
                }
            }

            var results = joinedEntities?.AsQueryable();
            var orderBy = query.ToDynamicLinqOrderByClause();
            var skip    = query.GetDefaultSkip();

            if (query.Wheres.Any())
            {
                var whereBy = query.Wheres.ToDynamicLinqWhereClause();
                results = results
                          .Where(whereBy);
            }
            return(results
                   .OrderBy(orderBy)
                   .Skip(skip)
                   .Take(take)
                   .Select(sel => new KeyValuePair <string, IReadOnlyDictionary <string, object> >(sel.Key, sel.Value))
                   .CherryPickSelectedProperties(query)
                   .Select(ped => QueryEntity.FromProperties(ped.Value, metadata))
                   .ToList());
        }