From 302226f10b7619c3f042278f644527cd592d7be1 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 10 Nov 2011 17:53:15 -0800 Subject: [PATCH] Allwing the content manager to get an optional set of predicates --HG-- branch : 1.x --- .../ContentManagement/DefaultContentQuery.cs | 45 ++++++++++++------- .../ContentManagement/IContentQuery.cs | 4 +- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/Orchard/ContentManagement/DefaultContentQuery.cs b/src/Orchard/ContentManagement/DefaultContentQuery.cs index 3abcd46ee..81a3979bd 100644 --- a/src/Orchard/ContentManagement/DefaultContentQuery.cs +++ b/src/Orchard/ContentManagement/DefaultContentQuery.cs @@ -75,21 +75,36 @@ namespace Orchard.ContentManagement { BindPartCriteria(); } - private void Where(Expression> predicate) where TRecord : ContentPartRecord { - - // build a linq to nhibernate expression - var options = new QueryOptions(); - var queryProvider = new NHibernateQueryProvider(BindSession(), options); - var queryable = new Query(queryProvider, options).Where(predicate); - - // translate it into the nhibernate ICriteria implementation - var criteria = (CriteriaImpl)queryProvider.TranslateExpression(queryable.Expression); + private void Where(Expression> predicate, params Expression>[] orPredicates) where TRecord : ContentPartRecord { // attach the criterion from the predicate to this query's criteria for the record var recordCriteria = BindPartCriteria(); - foreach (var expressionEntry in criteria.IterateExpressionEntries()) { - recordCriteria.Add(expressionEntry.Criterion); + var predicates = Enumerable + .Empty>>() + .Union(new []{predicate}) + .Union(orPredicates); + + var disjunction = Restrictions.Disjunction(); + + foreach (var p in predicates) { + // build a linq to nhibernate expression + var options = new QueryOptions(); + var queryProvider = new NHibernateQueryProvider(BindSession(), options); + + var queryable = new Query(queryProvider, options).Where(p); + var conjunction = Restrictions.Conjunction(); + + // translate it into the nhibernate ICriteria implementation + var criteria = (CriteriaImpl) queryProvider.TranslateExpression(queryable.Expression); + + foreach (var expressionEntry in criteria.IterateExpressionEntries()) { + conjunction.Add(expressionEntry.Criterion); + } + + disjunction.Add(conjunction); } + + recordCriteria.Add(disjunction); } private void Where(Action expression) { @@ -220,8 +235,8 @@ namespace Orchard.ContentManagement { return new ContentQuery(_query); } - IContentQuery IContentQuery.Where(Expression> predicate) { - _query.Where(predicate); + IContentQuery IContentQuery.Where(Expression> predicate, params Expression>[] orPredicates) { + _query.Where(predicate, orPredicates); return new ContentQuery(_query); } @@ -253,8 +268,8 @@ namespace Orchard.ContentManagement { return this; } - IContentQuery IContentQuery.Where(Expression> predicate) { - _query.Where(predicate); + IContentQuery IContentQuery.Where(Expression> predicate, params Expression>[] orPredicates) { + _query.Where(predicate, orPredicates); return this; } diff --git a/src/Orchard/ContentManagement/IContentQuery.cs b/src/Orchard/ContentManagement/IContentQuery.cs index deadb7d2e..c4ca89391 100644 --- a/src/Orchard/ContentManagement/IContentQuery.cs +++ b/src/Orchard/ContentManagement/IContentQuery.cs @@ -21,7 +21,7 @@ namespace Orchard.ContentManagement { IContentQuery Join() where TRecord : ContentPartRecord; IContentQuery Where(Action predicate); - IContentQuery Where(Expression> predicate) where TRecord : ContentPartRecord; + IContentQuery Where(Expression> predicate, params Expression>[] orPredicates) where TRecord : ContentPartRecord; IContentQuery OrderBy(Action order); IContentQuery OrderBy(Expression> keySelector) where TRecord : ContentPartRecord; @@ -31,7 +31,7 @@ namespace Orchard.ContentManagement { public interface IContentQuery : IContentQuery where TPart : IContent where TRecord : ContentPartRecord { new IContentQuery ForVersion(VersionOptions options); - IContentQuery Where(Expression> predicate); + IContentQuery Where(Expression> predicate, params Expression>[] orPredicates); IContentQuery OrderBy(Expression> keySelector); IContentQuery OrderByDescending(Expression> keySelector); }