示例#1
0
        public override IEnumerable List(FilterOptions filter)
        {
            if (!typeof(EntityViewModel).IsAssignableFrom(typeof(TModel)))
            {
                return(base.List(filter));
            }

            var        map     = EntityHelper.GetObjectMap(typeof(TModel));
            var        culture = StrixPlatform.CurrentCultureCode.ToLower();
            IQueryable query   = this.Manager.Query(map.ContentType).Where("Culture.ToLower().Equals(@0) AND IsCurrentVersion", culture);

            var queryEvent = new PrepareQueryEvent(query, filter);

            StrixPlatform.RaiseEvent(queryEvent);
            query = queryEvent.Query;

            return(query.Map(map.ListModelType));
        }
        public SearchResult Search(FilterOptions options)
        {
            if (options == null)
            {
                options = new FilterOptions();
            }

            var culture = StrixPlatform.CurrentCultureCode;
            var result = new SearchResult();
            result.Locators = PageRegistration.ContentLocators;
            var typesTosearch = EntityHelper.EntityTypes.Where(e => e.Name != typeof(MailContentTemplate).FullName && e.Name != typeof(MailContent).FullName).ToList();
            var itemsToSkip = options.PageSize == 1 ? 0 : options.PageSize * (options.Page - 1);

            // Todo: make configurable.
            var itemsToGet = options.PageSize == 0 ? 100 : options.PageSize;

            foreach (var entityType in typesTosearch)
            {
                var entryType = EntityHelper.GetEntityType(entityType.Id);
                var query = this._source.Query(entryType).Where("Culture.Equals(@0) AND IsCurrentVersion", culture);

                var queryEvent = new PrepareQueryEvent(query, options, false);
                StrixPlatform.RaiseEvent(queryEvent);
                query = queryEvent.Query;

                if (itemsToGet > 0)
                {
                    if (entryType.Equals(typeof(Html)))
                    {
                        var htmlTypeName = typeof(Html).FullName;
                        var htmlLocators = PageRegistration.ContentLocators.Where(l => l.ContentTypeName == htmlTypeName);
                        var htmlQuery = query.Cast<Html>().Select(h => new { Name = h.Name, Url = h.Entity.Url }).ToList().Select(h => new { Name = h.Name, Url = htmlLocators.Where(l => l.ContentUrl.ToLower() == h.Url.ToLower()).Select(l => l.PageUrl).FirstOrDefault() });
                        query = htmlQuery.GroupBy(h => h.Url).Select(h => new Html { Name = h.Select(i => i.Url.ToTitleCase()).First(), Entity = new PlatformEntity { Id = Guid.Empty, Url = h.Select(i => i.Url).First() } }).AsQueryable();
                    }

                    int addedItems = 0;
                    var entries = query.Skip(itemsToSkip).Take(itemsToGet).Select<SearchItem>("new (Entity.Id, Name, Entity.Url)").ToList();

                    foreach (var entry in entries)
                    {
                        entry.TypeName = entryType.FullName;
                        result.Data.Add(entry);
                        addedItems++;
                    }

                    options.Total = 0;
                    itemsToGet -= addedItems;
                }

                var queryCount = query.Count();
                itemsToSkip -= queryCount;

                if (itemsToSkip < 0)
                {
                    itemsToSkip = 0;
                }

                result.Total += queryCount;
            }

            return result;
        }
        public SearchResult Search(FilterOptions options)
        {
            if (options == null)
            {
                options = new FilterOptions();
            }

            var culture = StrixPlatform.CurrentCultureCode;
            var result  = new SearchResult();

            result.Locators = PageRegistration.ContentLocators;
            var typesTosearch = EntityHelper.EntityTypes.Where(e => e.Name != typeof(MailContentTemplate).FullName && e.Name != typeof(MailContent).FullName).ToList();
            var itemsToSkip   = options.PageSize == 1 ? 0 : options.PageSize * (options.Page - 1);

            // Todo: make configurable.
            var itemsToGet = options.PageSize == 0 ? 100 : options.PageSize;

            foreach (var entityType in typesTosearch)
            {
                var entryType = EntityHelper.GetEntityType(entityType.Id);
                var query     = this._source.Query(entryType).Where("Culture.Equals(@0) AND IsCurrentVersion", culture);

                var queryEvent = new PrepareQueryEvent(query, options, false);
                StrixPlatform.RaiseEvent(queryEvent);
                query = queryEvent.Query;

                if (itemsToGet > 0)
                {
                    if (entryType.Equals(typeof(Html)))
                    {
                        var htmlTypeName = typeof(Html).FullName;
                        var htmlLocators = PageRegistration.ContentLocators.Where(l => l.ContentTypeName == htmlTypeName);
                        var htmlQuery    = query.Cast <Html>().Select(h => new { Name = h.Name, Url = h.Entity.Url }).ToList().Select(h => new { Name = h.Name, Url = htmlLocators.Where(l => l.ContentUrl.ToLower() == h.Url.ToLower()).Select(l => l.PageUrl).FirstOrDefault() });
                        query = htmlQuery.GroupBy(h => h.Url).Select(h => new Html {
                            Name = h.Select(i => i.Url.ToTitleCase()).First(), Entity = new PlatformEntity {
                                Id = Guid.Empty, Url = h.Select(i => i.Url).First()
                            }
                        }).AsQueryable();
                    }

                    int addedItems = 0;
                    var entries    = query.Skip(itemsToSkip).Take(itemsToGet).Select <SearchItem>("new (Entity.Id, Name, Entity.Url)").ToList();

                    foreach (var entry in entries)
                    {
                        entry.TypeName = entryType.FullName;
                        result.Data.Add(entry);
                        addedItems++;
                    }

                    options.Total = 0;
                    itemsToGet   -= addedItems;
                }

                var queryCount = query.Count();
                itemsToSkip -= queryCount;

                if (itemsToSkip < 0)
                {
                    itemsToSkip = 0;
                }

                result.Total += queryCount;
            }

            return(result);
        }