diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs b/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs index b8dd1f279..4393d0849 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs @@ -120,9 +120,11 @@ namespace Orchard.Projections.Services { tokens.Add("Content", part.ContentItem); } - // aggregate the result for each group query - return GetContentQueries(queryRecord, Enumerable.Empty(), tokens) - .Sum(contentQuery => contentQuery.Count()); + var contentQueries = GetContentQueries(queryRecord, Enumerable.Empty(), tokens); + + return queryRecord.FilterGroups.Count > 1 ? + contentQueries.SelectMany(contentQuery => contentQuery.ListIds()).Distinct().Count() : + contentQueries.Sum(contentQuery => contentQuery.Count()); } public IEnumerable GetContentItems(int queryId, int skip = 0, int count = 0) { @@ -189,7 +191,7 @@ namespace Orchard.Projections.Services { groupQuery = sortCriterionContext.Query; } - return groupQuery.Slice(skip, count); + return groupQuery.Slice(0, count); } public IEnumerable GetContentQueries(QueryPartRecord queryRecord, IEnumerable sortCriteria, Dictionary tokens) { diff --git a/src/Orchard/ContentManagement/DefaultHqlQuery.cs b/src/Orchard/ContentManagement/DefaultHqlQuery.cs index b22c8e061..92d630b20 100644 --- a/src/Orchard/ContentManagement/DefaultHqlQuery.cs +++ b/src/Orchard/ContentManagement/DefaultHqlQuery.cs @@ -184,10 +184,21 @@ namespace Orchard.ContentManagement { return Slice(0, 0); } - public IEnumerable Slice(int skip, int count) { + public IEnumerable ListIds() { + return ListIds(0, 0); + } + + public IEnumerable Slice(int skip, int count) + { + var ids = ListIds(skip, count); + return ContentManager.GetManyByVersionId(ids, new QueryHints().ExpandRecords(_includedPartRecords)); + } + + private IEnumerable ListIds(int skip, int count) + { ApplyHqlVersionOptionsRestrictions(_versionOptions); _cacheable = true; - + var hql = ToHql(false); var query = _session @@ -195,19 +206,19 @@ namespace Orchard.ContentManagement { .SetCacheable(_cacheable) ; - if (skip != 0) { + if (skip != 0) + { query.SetFirstResult(skip); } - if (count != 0 && count != Int32.MaxValue) { + if (count != 0 && count != Int32.MaxValue) + { query.SetMaxResults(count); } - var ids = query + return query .SetResultTransformer(Transformers.AliasToEntityMap) .List() .Select(x => (int)x["Id"]); - - return ContentManager.GetManyByVersionId(ids, new QueryHints().ExpandRecords(_includedPartRecords)); } public int Count() { diff --git a/src/Orchard/ContentManagement/IHqlQuery.cs b/src/Orchard/ContentManagement/IHqlQuery.cs index fc8d1279e..4b4250b7b 100644 --- a/src/Orchard/ContentManagement/IHqlQuery.cs +++ b/src/Orchard/ContentManagement/IHqlQuery.cs @@ -40,6 +40,11 @@ namespace Orchard.ContentManagement { /// IEnumerable List(); + /// + /// Executes the query and returns all ids for matching content items. + /// + IEnumerable ListIds(); + /// /// Returns a subset of the matching content items. ///