예제 #1
0
        public static bool HasAnyJoins <TEntity>(this QueryClause <TEntity> query)
            where TEntity : IQueryableEntity
        {
            query.GuardAgainstNull(nameof(query));

            return(query.JoinedEntities
                   .Any(je => je.Join.Exists()));
        }
예제 #2
0
        public static QueryClause <TEntity> WithSearchOptions <TEntity>(this QueryClause <TEntity> query,
                                                                        SearchOptions options)
            where TEntity : IQueryableEntity
        {
            query.GuardAgainstNull(nameof(query));
            options.GuardAgainstNull(nameof(options));

            if (options.Offset > ResultOptions.DefaultOffset)
            {
                query.Skip(options.Offset);
            }

            if (options.Limit > ResultOptions.DefaultLimit)
            {
                query.Take(options.Limit);
            }

            if (options.Sort.By.HasValue())
            {
                var propertyName       = options.Sort.By;
                var propertyExpression = GetPropertyExpression <TEntity>(propertyName);
                if (propertyExpression != null)
                {
                    query.OrderBy(propertyExpression, options.Sort.Direction == SortDirection.Ascending
                        ? OrderDirection.Ascending
                        : OrderDirection.Descending);
                }
            }

            if (options.Filter.Fields.Any())
            {
                foreach (var field in options.Filter.Fields)
                {
                    var propertyExpression = GetPropertyExpression <TEntity>(field);
                    if (propertyExpression != null)
                    {
                        query.Select(propertyExpression);
                    }
                }
            }

            return(query);
        }
예제 #3
0
        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());
        }