From: <ric...@us...> - 2011-05-29 18:06:28
|
Revision: 5879 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5879&view=rev Author: ricbrown Date: 2011-05-29 18:06:21 +0000 (Sun, 29 May 2011) Log Message: ----------- NH-2683: Added QueryOver functions to projections and SQL functions Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Lambda/LambdaRestrictionBuilder.cs trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs trunk/nhibernate/src/NHibernate/Criterion/Projections.cs trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs trunk/nhibernate/src/NHibernate/Criterion/RestrictionsExtensions.cs trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/LambdaRestrictionBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/LambdaRestrictionBuilder.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/LambdaRestrictionBuilder.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -14,13 +14,13 @@ { public class LambdaBetweenBuilder { - private string propertyName; + private IProjection projection; private object lo; private bool isNot; - public LambdaBetweenBuilder(string propertyName, object lo, bool isNot) + public LambdaBetweenBuilder(IProjection projection, object lo, bool isNot) { - this.propertyName = propertyName; + this.projection = projection; this.lo = lo; this.isNot = isNot; } @@ -28,13 +28,13 @@ public AbstractCriterion And(object hi) { if (isNot) - return Restrictions.Not(Restrictions.Between(propertyName, lo, hi)); + return Restrictions.Not(Restrictions.Between(projection, lo, hi)); - return Restrictions.Between(propertyName, lo, hi); + return Restrictions.Between(projection, lo, hi); } } - private string propertyName; + private IProjection projection; private bool isNot; private AbstractCriterion Process(AbstractCriterion criterion) @@ -48,9 +48,9 @@ /// <summary> /// Constructed with property name /// </summary> - public LambdaRestrictionBuilder(string propertyName) + public LambdaRestrictionBuilder(IProjection projection) { - this.propertyName = propertyName; + this.projection = projection; } /// <summary> @@ -58,7 +58,7 @@ /// </summary> public LambdaBetweenBuilder IsBetween(object lo) { - return new LambdaBetweenBuilder(propertyName, lo, isNot); + return new LambdaBetweenBuilder(projection, lo, isNot); } public LambdaRestrictionBuilder Not @@ -75,7 +75,7 @@ /// </summary> public AbstractCriterion IsIn(ICollection values) { - return Process(Restrictions.In(propertyName, values)); + return Process(Restrictions.In(projection, values)); } /// <summary> @@ -83,7 +83,7 @@ /// </summary> public AbstractCriterion IsIn(object[] values) { - return Process(Restrictions.In(propertyName, values)); + return Process(Restrictions.In(projection, values)); } /// <summary> @@ -91,7 +91,7 @@ /// </summary> public AbstractCriterion IsInG<T>(ICollection<T> values) { - return Process(Restrictions.InG(propertyName, values)); + return Process(Restrictions.InG(projection, values)); } /// <summary> @@ -99,7 +99,7 @@ /// </summary> public AbstractCriterion IsInsensitiveLike(object value) { - return Process(Restrictions.InsensitiveLike(propertyName, value)); + return Process(Restrictions.InsensitiveLike(projection, value)); } /// <summary> @@ -107,7 +107,7 @@ /// </summary> public AbstractCriterion IsInsensitiveLike(string value, MatchMode matchMode) { - return Process(Restrictions.InsensitiveLike(propertyName, value, matchMode)); + return Process(Restrictions.InsensitiveLike(projection, value, matchMode)); } /// <summary> @@ -115,7 +115,7 @@ /// </summary> public AbstractCriterion IsEmpty { - get { return Process(Restrictions.IsEmpty(propertyName)); } + get { return Process(Restrictions.IsEmpty(ExpressionProcessor.FindProperty(projection))); } } /// <summary> @@ -123,7 +123,7 @@ /// </summary> public AbstractCriterion IsNotEmpty { - get { return Process(Restrictions.IsNotEmpty(propertyName)); } + get { return Process(Restrictions.IsNotEmpty(ExpressionProcessor.FindProperty(projection))); } } /// <summary> @@ -131,7 +131,7 @@ /// </summary> public AbstractCriterion IsNull { - get { return Process(Restrictions.IsNull(propertyName)); } + get { return Process(Restrictions.IsNull(projection)); } } /// <summary> @@ -139,7 +139,7 @@ /// </summary> public AbstractCriterion IsNotNull { - get { return Process(Restrictions.IsNotNull(propertyName)); } + get { return Process(Restrictions.IsNotNull(projection)); } } /// <summary> @@ -147,7 +147,7 @@ /// </summary> public AbstractCriterion IsLike(object value) { - return Process(Restrictions.Like(propertyName, value)); + return Process(Restrictions.Like(projection, value)); } /// <summary> @@ -155,7 +155,7 @@ /// </summary> public AbstractCriterion IsLike(string value, MatchMode matchMode) { - return Process(Restrictions.Like(propertyName, value, matchMode)); + return Process(Restrictions.Like(projection, value, matchMode)); } /// <summary> @@ -163,7 +163,7 @@ /// </summary> public AbstractCriterion IsLike(string value, MatchMode matchMode, char? escapeChar) { - return Process(Restrictions.Like(propertyName, value, matchMode, escapeChar)); + return Process(Restrictions.Like(ExpressionProcessor.FindProperty(projection), value, matchMode, escapeChar)); } } Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverRestrictionBuilder.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -13,8 +13,8 @@ public class QueryOverRestrictionBuilder<TRoot,TSubType> : QueryOverRestrictionBuilderBase<QueryOver<TRoot,TSubType>, TRoot, TSubType> { - public QueryOverRestrictionBuilder(QueryOver<TRoot,TSubType> root, string propertyName) - : base(root, propertyName) { } + public QueryOverRestrictionBuilder(QueryOver<TRoot,TSubType> root, IProjection projection) + : base(root, projection) { } public QueryOverRestrictionBuilder<TRoot,TSubType> Not { @@ -30,8 +30,8 @@ public class IQueryOverRestrictionBuilder<TRoot,TSubType> : QueryOverRestrictionBuilderBase<IQueryOver<TRoot,TSubType>, TRoot, TSubType> { - public IQueryOverRestrictionBuilder(IQueryOver<TRoot,TSubType> root, string propertyName) - : base(root, propertyName) { } + public IQueryOverRestrictionBuilder(IQueryOver<TRoot,TSubType> root, IProjection projection) + : base(root, projection) { } public IQueryOverRestrictionBuilder<TRoot,TSubType> Not { @@ -50,14 +50,14 @@ public class LambdaBetweenBuilder { private TReturn root; - private string propertyName; + private IProjection projection; private bool isNot; private object lo; - public LambdaBetweenBuilder(TReturn root, string propertyName, bool isNot, object lo) + public LambdaBetweenBuilder(TReturn root, IProjection projection, bool isNot, object lo) { this.root = root; - this.propertyName = propertyName; + this.projection = projection; this.isNot = isNot; this.lo = lo; } @@ -72,21 +72,21 @@ public TReturn And(object hi) { - return Add(Restrictions.Between(propertyName, lo, hi)); + return Add(Restrictions.Between(projection, lo, hi)); } } private TReturn root; - private string propertyName; + private IProjection projection; protected bool isNot; /// <summary> /// Constructed with property name /// </summary> - public QueryOverRestrictionBuilderBase(TReturn root, string propertyName) + public QueryOverRestrictionBuilderBase(TReturn root, IProjection projection) { this.root = root; - this.propertyName = propertyName; + this.projection = projection; } private TReturn Add(ICriterion criterion) @@ -102,7 +102,7 @@ /// </summary> public LambdaBetweenBuilder IsBetween(object lo) { - return new LambdaBetweenBuilder(root, propertyName, isNot, lo); + return new LambdaBetweenBuilder(root, projection, isNot, lo); } /// <summary> @@ -110,7 +110,7 @@ /// </summary> public TReturn IsIn(ICollection values) { - return Add(Restrictions.In(propertyName, values)); + return Add(Restrictions.In(projection, values)); } /// <summary> @@ -118,7 +118,7 @@ /// </summary> public TReturn IsIn(object[] values) { - return Add(Restrictions.In(propertyName, values)); + return Add(Restrictions.In(projection, values)); } /// <summary> @@ -126,7 +126,7 @@ /// </summary> public TReturn IsInG<T>(ICollection<T> values) { - return Add(Restrictions.InG(propertyName, values)); + return Add(Restrictions.InG(projection, values)); } /// <summary> @@ -134,7 +134,7 @@ /// </summary> public TReturn IsInsensitiveLike(object value) { - return Add(Restrictions.InsensitiveLike(propertyName, value)); + return Add(Restrictions.InsensitiveLike(projection, value)); } /// <summary> @@ -142,7 +142,7 @@ /// </summary> public TReturn IsInsensitiveLike(string value, MatchMode matchMode) { - return Add(Restrictions.InsensitiveLike(propertyName, value, matchMode)); + return Add(Restrictions.InsensitiveLike(projection, value, matchMode)); } /// <summary> @@ -150,7 +150,7 @@ /// </summary> public TReturn IsEmpty { - get { return Add(Restrictions.IsEmpty(propertyName)); } + get { return Add(Restrictions.IsEmpty(ExpressionProcessor.FindProperty(projection))); } } /// <summary> @@ -158,7 +158,7 @@ /// </summary> public TReturn IsNotEmpty { - get { return Add(Restrictions.IsNotEmpty(propertyName)); } + get { return Add(Restrictions.IsNotEmpty(ExpressionProcessor.FindProperty(projection))); } } /// <summary> @@ -166,7 +166,7 @@ /// </summary> public TReturn IsNull { - get { return Add(Restrictions.IsNull(propertyName)); } + get { return Add(Restrictions.IsNull(projection)); } } /// <summary> @@ -174,7 +174,7 @@ /// </summary> public TReturn IsNotNull { - get { return Add(Restrictions.IsNotNull(propertyName)); } + get { return Add(Restrictions.IsNotNull(projection)); } } /// <summary> @@ -182,7 +182,7 @@ /// </summary> public TReturn IsLike(object value) { - return Add(Restrictions.Like(propertyName, value)); + return Add(Restrictions.Like(projection, value)); } /// <summary> @@ -190,7 +190,7 @@ /// </summary> public TReturn IsLike(string value, MatchMode matchMode) { - return Add(Restrictions.Like(propertyName, value, matchMode)); + return Add(Restrictions.Like(projection, value, matchMode)); } /// <summary> @@ -198,7 +198,7 @@ /// </summary> public TReturn IsLike(string value, MatchMode matchMode, char? escapeChar) { - return Add(Restrictions.Like(propertyName, value, matchMode, escapeChar)); + return Add(Restrictions.Like(ExpressionProcessor.FindProperty(projection), value, matchMode, escapeChar)); } } Modified: trunk/nhibernate/src/NHibernate/Criterion/Projections.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/Projections.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -324,7 +324,7 @@ /// </summary> public static AggregateProjection Avg<T>(Expression<Func<T, object>> expression) { - return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Avg(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -332,7 +332,7 @@ /// </summary> public static AggregateProjection Avg(Expression<Func<object>> expression) { - return Projections.Avg(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Avg(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -340,7 +340,7 @@ /// </summary> public static CountProjection Count<T>(Expression<Func<T, object>> expression) { - return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Count(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -348,7 +348,7 @@ /// </summary> public static CountProjection Count(Expression<Func<object>> expression) { - return Projections.Count(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Count(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -388,7 +388,7 @@ /// </summary> public static AggregateProjection Max<T>(Expression<Func<T, object>> expression) { - return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Max(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -396,7 +396,7 @@ /// </summary> public static AggregateProjection Max(Expression<Func<object>> expression) { - return Projections.Max(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Max(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -404,7 +404,7 @@ /// </summary> public static AggregateProjection Min<T>(Expression<Func<T, object>> expression) { - return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Min(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -412,7 +412,7 @@ /// </summary> public static AggregateProjection Min(Expression<Func<object>> expression) { - return Projections.Min(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Min(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -441,7 +441,7 @@ /// </summary> public static AggregateProjection Sum<T>(Expression<Func<T, object>> expression) { - return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Sum(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> @@ -449,7 +449,7 @@ /// </summary> public static AggregateProjection Sum(Expression<Func<object>> expression) { - return Projections.Sum(ExpressionProcessor.FindMemberExpression(expression.Body)); + return Projections.Sum(ExpressionProcessor.FindMemberProjection(expression.Body)); } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -344,12 +344,12 @@ public QueryOverRestrictionBuilder<TRoot,TSubType> AndRestrictionOn(Expression<Func<TSubType, object>> expression) { - return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); + return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } public QueryOverRestrictionBuilder<TRoot,TSubType> AndRestrictionOn(Expression<Func<object>> expression) { - return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); + return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } public QueryOver<TRoot,TSubType> Where(Expression<Func<TSubType, bool>> expression) @@ -379,12 +379,12 @@ public QueryOverRestrictionBuilder<TRoot,TSubType> WhereRestrictionOn(Expression<Func<TSubType, object>> expression) { - return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); + return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } public QueryOverRestrictionBuilder<TRoot,TSubType> WhereRestrictionOn(Expression<Func<object>> expression) { - return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); + return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } public QueryOver<TRoot,TSubType> Select(params Expression<Func<TRoot, object>>[] projections) @@ -791,10 +791,10 @@ { return AndNot(expression); } IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.AndRestrictionOn(Expression<Func<TSubType, object>> expression) - { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } + { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.AndRestrictionOn(Expression<Func<object>> expression) - { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } + { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.Where(Expression<Func<TSubType, bool>> expression) { return Where(expression); } @@ -812,10 +812,10 @@ { return WhereNot(expression); } IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.WhereRestrictionOn(Expression<Func<TSubType, object>> expression) - { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } + { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.WhereRestrictionOn(Expression<Func<object>> expression) - { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } + { return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); } IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.Select(params Expression<Func<TRoot, object>>[] projections) { return Select(projections); } Modified: trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/Restrictions.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -790,8 +790,8 @@ /// <returns>returns LambdaRestrictionBuilder</returns> public static LambdaRestrictionBuilder On<T>(Expression<Func<T, object>> expression) { - string property = ExpressionProcessor.FindMemberExpression(expression.Body); - return new LambdaRestrictionBuilder(property); + IProjection projection = ExpressionProcessor.FindMemberProjection(expression.Body); + return new LambdaRestrictionBuilder(projection); } /// <summary> @@ -801,8 +801,8 @@ /// <returns>returns LambdaRestrictionBuilder</returns> public static LambdaRestrictionBuilder On(Expression<Func<object>> expression) { - string property = ExpressionProcessor.FindMemberExpression(expression.Body); - return new LambdaRestrictionBuilder(property); + IProjection projection = ExpressionProcessor.FindMemberProjection(expression.Body); + return new LambdaRestrictionBuilder(projection); } } Modified: trunk/nhibernate/src/NHibernate/Criterion/RestrictionsExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/RestrictionsExtensions.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Criterion/RestrictionsExtensions.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -89,17 +89,17 @@ public static ICriterion ProcessIsLike(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); object value = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); - return Restrictions.Like(property, value); + return Restrictions.Like(projection, value); } public static ICriterion ProcessIsLikeMatchMode(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); string value = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); MatchMode matchMode = (MatchMode)ExpressionProcessor.FindValue(methodCallExpression.Arguments[2]); - return Restrictions.Like(property, value, matchMode); + return Restrictions.Like(projection, value, matchMode); } public static ICriterion ProcessIsLikeMatchModeEscapeChar(MethodCallExpression methodCallExpression) @@ -113,40 +113,40 @@ public static ICriterion ProcessIsInsensitiveLike(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); object value = ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); - return Restrictions.InsensitiveLike(property, value); + return Restrictions.InsensitiveLike(projection, value); } public static ICriterion ProcessIsInsensitiveLikeMatchMode(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); string value = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); MatchMode matchMode = (MatchMode)ExpressionProcessor.FindValue(methodCallExpression.Arguments[2]); - return Restrictions.InsensitiveLike(property, value, matchMode); + return Restrictions.InsensitiveLike(projection, value, matchMode); } public static ICriterion ProcessIsInArray(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); object[] values = (object[])ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); - return Restrictions.In(property, values); + return Restrictions.In(projection, values); } public static ICriterion ProcessIsInCollection(MethodCallExpression methodCallExpression) { - string property = ExpressionProcessor.FindMemberExpression(methodCallExpression.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]); ICollection values = (ICollection)ExpressionProcessor.FindValue(methodCallExpression.Arguments[1]); - return Restrictions.In(property, values); + return Restrictions.In(projection, values); } public static ICriterion ProcessIsBetween(MethodCallExpression methodCallExpression) { MethodCallExpression betweenFunction = (MethodCallExpression)methodCallExpression.Object; - string property = ExpressionProcessor.FindMemberExpression(betweenFunction.Arguments[0]); + IProjection projection = ExpressionProcessor.FindMemberProjection(betweenFunction.Arguments[0]); object lo = ExpressionProcessor.FindValue(betweenFunction.Arguments[1]); object hi = ExpressionProcessor.FindValue(methodCallExpression.Arguments[0]); - return Restrictions.Between(property, lo, hi); + return Restrictions.Between(projection, lo, hi); } } } Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -741,6 +741,18 @@ _customProjectionProcessors.Add(signature, functionProcessor); } + /// <summary> + /// Retreive the property name from a supplied PropertyProjection + /// Note: throws is the supplied IProjection is not a PropertyProjection + /// </summary> + public static string FindProperty(IProjection projection) + { + if (!(projection is PropertyProjection)) + throw new Exception("Cannot determine property for " + projection.ToString()); + + return ((PropertyProjection)projection).PropertyName; + } + } } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -593,6 +593,19 @@ using (ISession s = OpenSession()) { + var persons = + s.QueryOver<Person>() + .Where(p => p.BirthDate.YearPart().IsIn(new [] { 2008, 2009 })) + .OrderBy(p => p.Name).Asc + .List(); + + persons.Count.Should().Be(2); + persons[0].Name.Should().Be("p1"); + persons[1].Name.Should().Be("p2"); + } + + using (ISession s = OpenSession()) + { var yearOfBirth = s.QueryOver<Person>() .Where(p => p.Name == "p2") @@ -605,6 +618,17 @@ using (ISession s = OpenSession()) { + var avgYear = + s.QueryOver<Person>() + .SelectList(list => list.SelectAvg(p => p.BirthDate.YearPart())) + .SingleOrDefault<object>(); + + avgYear.GetType().Should().Be(typeof(double)); + string.Format("{0:0}", avgYear).Should().Be("2008"); + } + + using (ISession s = OpenSession()) + { var sqrtOfAge = s.QueryOver<Person>() .Where(p => p.Name == "p1") Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/ProjectionsFixture.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -39,24 +39,24 @@ ICriteria expected = CreateTestCriteria(typeof(Person), "personAlias") .SetProjection(Projections.ProjectionList() - .Add(Projections.Alias(Projections.Avg("Age"), "personAgeProjectionAlias")) - .Add(Projections.Avg("Age"), "personAgeProjectionAlias") - .Add(Projections.Avg("personAlias.Age"), "Age") - .Add(Projections.Count("Age")) - .Add(Projections.Count("personAlias.Age")) + .Add(Projections.Alias(Projections.Avg(Projections.Property("Age")), "personAgeProjectionAlias")) + .Add(Projections.Avg(Projections.Property("Age")), "personAgeProjectionAlias") + .Add(Projections.Avg(Projections.Property("personAlias.Age")), "Age") + .Add(Projections.Count(Projections.Property("Age"))) + .Add(Projections.Count(Projections.Property("personAlias.Age"))) .Add(Projections.CountDistinct("Age")) .Add(Projections.CountDistinct("personAlias.Age")) .Add(Projections.GroupProperty("Age")) .Add(Projections.GroupProperty("personAlias.Age")) - .Add(Projections.Max("Age")) - .Add(Projections.Max("personAlias.Age")) - .Add(Projections.Min("Age")) - .Add(Projections.Min("personAlias.Age")) + .Add(Projections.Max(Projections.Property("Age"))) + .Add(Projections.Max(Projections.Property("personAlias.Age"))) + .Add(Projections.Min(Projections.Property("Age"))) + .Add(Projections.Min(Projections.Property("personAlias.Age"))) .Add(Projections.Property("Age")) .Add(Projections.Property("personAlias.Age")) .Add(Projections.SubQuery(DetachedCriteriaAge)) - .Add(Projections.Sum("Age")) - .Add(Projections.Sum("personAlias.Age"))); + .Add(Projections.Sum(Projections.Property("Age"))) + .Add(Projections.Sum(Projections.Property("personAlias.Age")))); Person personAlias = null; Person personAgeProjectionAlias = null; @@ -91,24 +91,24 @@ ICriteria expected = CreateTestCriteria(typeof(Person), "personAlias") .SetProjection(Projections.ProjectionList() - .Add(Projections.Alias(Projections.Avg("Age"), "personAgeProjectionAlias")) + .Add(Projections.Alias(Projections.Avg(Projections.Property("Age")), "personAgeProjectionAlias")) .Add(Projections.Avg("Age")) - .Add(Projections.Avg("personAlias.Age"), "Age") - .Add(Projections.Count("Age")) - .Add(Projections.Count("personAlias.Age")) + .Add(Projections.Avg(Projections.Property("personAlias.Age")), "Age") + .Add(Projections.Count(Projections.Property("Age"))) + .Add(Projections.Count(Projections.Property("personAlias.Age"))) .Add(Projections.CountDistinct("Age")) .Add(Projections.CountDistinct("personAlias.Age")) .Add(Projections.GroupProperty("Age")) .Add(Projections.GroupProperty("personAlias.Age")) - .Add(Projections.Max("Age")) - .Add(Projections.Max("personAlias.Age")) - .Add(Projections.Min("Age")) - .Add(Projections.Min("personAlias.Age")) + .Add(Projections.Max(Projections.Property("Age"))) + .Add(Projections.Max(Projections.Property("personAlias.Age"))) + .Add(Projections.Min(Projections.Property("Age"))) + .Add(Projections.Min(Projections.Property("personAlias.Age"))) .Add(Projections.Property("Age")) .Add(Projections.Property("personAlias.Age")) .Add(Projections.SubQuery(DetachedCriteriaAge)) - .Add(Projections.Sum("Age")) - .Add(Projections.Sum("personAlias.Age"))); + .Add(Projections.Sum(Projections.Property("Age"))) + .Add(Projections.Sum(Projections.Property("personAlias.Age")))); Person personAlias = null; Person personAgeProjectionAlias = null; Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -151,7 +151,7 @@ CreateTestCriteria(typeof(Person), "personAlias") .Add(Restrictions.Or( Restrictions.Not(Restrictions.Eq(Projections.Property("Name"), "test name")), - Restrictions.Not(Restrictions.Like("personAlias.Name", "%test%")))); + Restrictions.Not(Restrictions.Like(Projections.Property("personAlias.Name"), "%test%")))); Person personAlias = null; IQueryOver<Person> actual = Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2011-05-29 02:36:57 UTC (rev 5878) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/RestrictionsFixture.cs 2011-05-29 18:06:21 UTC (rev 5879) @@ -38,22 +38,22 @@ { ICriteria expected = CreateTestCriteria(typeof(Person), "personAlias") - .Add(Restrictions.Between("Age", 18, 65)) - .Add(Restrictions.Between("personAlias.Age", 18, 65)) - .Add(Restrictions.Not(Restrictions.Between("personAlias.Age", 10, 20))) - .Add(!Restrictions.In("Name", new string[] { "name4" })) - .Add(Restrictions.In("Name", new string[] { "name1", "name2", "name3" })) - .Add(Restrictions.In("Name", new ArrayList() { "name1", "name2", "name3" })) - .Add(Restrictions.InG<int>("Age", new int[] { 1, 2, 3 })) - .Add(Restrictions.InsensitiveLike("Name", "test")) - .Add(Restrictions.InsensitiveLike("Name", "tEsT", MatchMode.Anywhere)) + .Add(Restrictions.Between(Projections.Property("Age"), 18, 65)) + .Add(Restrictions.Between(Projections.Property("personAlias.Age"), 18, 65)) + .Add(Restrictions.Not(Restrictions.Between(Projections.Property("personAlias.Age"), 10, 20))) + .Add(!Restrictions.In(Projections.Property("Name"), new string[] { "name4" })) + .Add(Restrictions.In(Projections.Property("Name"), new string[] { "name1", "name2", "name3" })) + .Add(Restrictions.In(Projections.Property("Name"), new ArrayList() { "name1", "name2", "name3" })) + .Add(Restrictions.InG<int>(Projections.Property("Age"), new int[] { 1, 2, 3 })) + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "test")) + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "tEsT", MatchMode.Anywhere)) .Add(Restrictions.IsEmpty("Children")) .Add(Restrictions.Not(Restrictions.IsEmpty("Children"))) .Add(Restrictions.IsNotEmpty("Children")) - .Add(Restrictions.IsNotNull("Name")) - .Add(Restrictions.IsNull("Name")) - .Add(Restrictions.Like("Name", "%test%")) - .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere)) + .Add(Restrictions.IsNotNull(Projections.Property("Name"))) + .Add(Restrictions.IsNull(Projections.Property("Name"))) + .Add(Restrictions.Like(Projections.Property("Name"), "%test%")) + .Add(Restrictions.Like(Projections.Property("Name"), "test", MatchMode.Anywhere)) .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere, '?')) .Add(Restrictions.NaturalId() .Set("Name", "my name") @@ -116,22 +116,22 @@ { ICriteria expected = CreateTestCriteria(typeof(Person), "personAlias") - .Add(Restrictions.Between("Age", 18, 65)) - .Add(Restrictions.Between("personAlias.Age", 18, 65)) - .Add(Restrictions.Not(Restrictions.Between("Age", 18, 65))) - .Add(Restrictions.In("Name", new string[] { "name1", "name2", "name3" })) - .Add(Restrictions.In("personAlias.Name", new ArrayList() { "name1", "name2", "name3" })) - .Add(Restrictions.InG<int>("Age", new int[] { 1, 2, 3 })) - .Add(Restrictions.InsensitiveLike("Name", "test")) - .Add(Restrictions.InsensitiveLike("Name", "tEsT", MatchMode.Anywhere)) + .Add(Restrictions.Between(Projections.Property("Age"), 18, 65)) + .Add(Restrictions.Between(Projections.Property("personAlias.Age"), 18, 65)) + .Add(Restrictions.Not(Restrictions.Between(Projections.Property("Age"), 18, 65))) + .Add(Restrictions.In(Projections.Property("Name"), new string[] { "name1", "name2", "name3" })) + .Add(Restrictions.In(Projections.Property("personAlias.Name"), new ArrayList() { "name1", "name2", "name3" })) + .Add(Restrictions.InG<int>(Projections.Property("Age"), new int[] { 1, 2, 3 })) + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "test")) + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "tEsT", MatchMode.Anywhere)) .Add(Restrictions.IsEmpty("Children")) .Add(Restrictions.IsNotEmpty("Children")) - .Add(Restrictions.IsNotNull("Name")) - .Add(Restrictions.IsNull("Name")) - .Add(Restrictions.Like("Name", "%test%")) - .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere)) + .Add(Restrictions.IsNotNull(Projections.Property("Name"))) + .Add(Restrictions.IsNull(Projections.Property("Name"))) + .Add(Restrictions.Like(Projections.Property("Name"), "%test%")) + .Add(Restrictions.Like(Projections.Property("Name"), "test", MatchMode.Anywhere)) .Add(Restrictions.Like("Name", "test", MatchMode.Anywhere, '?')) - .Add(Restrictions.Not(Restrictions.Like("Name", "%test%"))); + .Add(Restrictions.Not(Restrictions.Like(Projections.Property("Name"), "%test%"))); Person personAlias = null; var actual = @@ -161,10 +161,10 @@ { DetachedCriteria expected = DetachedCriteria.For<Person>("personAlias") - .Add(Restrictions.Between("Age", 18, 65)) - .Add(Restrictions.Between("personAlias.Age", 18, 65)) - .Add(Restrictions.In("Name", new string[] { "name1", "name2", "name3" })) - .Add(Restrictions.In("personAlias.Name", new ArrayList() { "name1", "name2", "name3" })); + .Add(Restrictions.Between(Projections.Property("Age"), 18, 65)) + .Add(Restrictions.Between(Projections.Property("personAlias.Age"), 18, 65)) + .Add(Restrictions.In(Projections.Property("Name"), new string[] { "name1", "name2", "name3" })) + .Add(Restrictions.In(Projections.Property("personAlias.Name"), new ArrayList() { "name1", "name2", "name3" })); Person personAlias = null; QueryOver<Person> actual = @@ -232,14 +232,14 @@ { ICriteria expected = CreateTestCriteria(typeof(Person)) - .Add(Restrictions.Like("Name", "%test%")) - .Add(Restrictions.Like("Name", "test", MatchMode.End)) + .Add(Restrictions.Like(Projections.Property("Name"), "%test%")) + .Add(Restrictions.Like(Projections.Property("Name"), "test", MatchMode.End)) .Add(Restrictions.Like("Name", "test", MatchMode.Start, '?')) - .Add(Restrictions.InsensitiveLike("Name", "%test%")) - .Add(Restrictions.InsensitiveLike("Name", "test", MatchMode.Anywhere)) - .Add(Restrictions.In("Name", new string[] { "name1", "name2" })) - .Add(Restrictions.In("Name", new ArrayList() { "name3", "name4" })) - .Add(Restrictions.Between("Age", 10, 20)); + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "%test%")) + .Add(Restrictions.InsensitiveLike(Projections.Property("Name"), "test", MatchMode.Anywhere)) + .Add(Restrictions.In(Projections.Property("Name"), new string[] { "name1", "name2" })) + .Add(Restrictions.In(Projections.Property("Name"), new ArrayList() { "name3", "name4" })) + .Add(Restrictions.Between(Projections.Property("Age"), 10, 20)); IQueryOver<Person> actual = CreateTestQueryOver<Person>() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |