From: <ric...@us...> - 2009-11-20 21:28:58
|
Revision: 4848 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4848&view=rev Author: ricbrown Date: 2009-11-20 21:28:47 +0000 (Fri, 20 Nov 2009) Log Message: ----------- Added convenience syntax for negation of expressions. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/IQueryOver.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-11-20 20:13:57 UTC (rev 4847) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-11-20 21:28:47 UTC (rev 4848) @@ -89,6 +89,16 @@ return Add(expression); } + public QueryOver<T> AndNot(Expression<Func<T, bool>> expression) + { + return AddNot(expression); + } + + public QueryOver<T> AndNot(Expression<Func<bool>> expression) + { + return AddNot(expression); + } + public QueryOverRestrictionBuilder<T> AndRestrictionOn(Expression<Func<T, object>> expression) { return new QueryOverRestrictionBuilder<T>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); @@ -114,6 +124,16 @@ return Add(expression); } + public QueryOver<T> WhereNot(Expression<Func<T, bool>> expression) + { + return AddNot(expression); + } + + public QueryOver<T> WhereNot(Expression<Func<bool>> expression) + { + return AddNot(expression); + } + public QueryOverRestrictionBuilder<T> WhereRestrictionOn(Expression<Func<T, object>> expression) { return new QueryOverRestrictionBuilder<T>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); @@ -464,7 +484,19 @@ return this; } + private QueryOver<T> AddNot(Expression<Func<T, bool>> expression) + { + _criteria.Add(Restrictions.Not(ExpressionProcessor.ProcessExpression<T>(expression))); + return this; + } + private QueryOver<T> AddNot(Expression<Func<bool>> expression) + { + _criteria.Add(Restrictions.Not(ExpressionProcessor.ProcessExpression(expression))); + return this; + } + + ICriteria IQueryOver<T>.UnderlyingCriteria { get { return UnderlyingCriteria; } } @@ -477,6 +509,12 @@ IQueryOver<T> IQueryOver<T>.And(ICriterion expression) { return And(expression); } + IQueryOver<T> IQueryOver<T>.AndNot(Expression<Func<T, bool>> expression) + { return AndNot(expression); } + + IQueryOver<T> IQueryOver<T>.AndNot(Expression<Func<bool>> expression) + { return AndNot(expression); } + IQueryOverRestrictionBuilder<T> IQueryOver<T>.AndRestrictionOn(Expression<Func<T, object>> expression) { return new IQueryOverRestrictionBuilder<T>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } @@ -492,6 +530,12 @@ IQueryOver<T> IQueryOver<T>.Where(ICriterion expression) { return Where(expression); } + IQueryOver<T> IQueryOver<T>.WhereNot(Expression<Func<T, bool>> expression) + { return WhereNot(expression); } + + IQueryOver<T> IQueryOver<T>.WhereNot(Expression<Func<bool>> expression) + { return WhereNot(expression); } + IQueryOverRestrictionBuilder<T> IQueryOver<T>.WhereRestrictionOn(Expression<Func<T, object>> expression) { return new IQueryOverRestrictionBuilder<T>(this, ExpressionProcessor.FindMemberExpression(expression.Body)); } Modified: trunk/nhibernate/src/NHibernate/IQueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-11-20 20:13:57 UTC (rev 4847) +++ trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-11-20 21:28:47 UTC (rev 4848) @@ -50,6 +50,20 @@ IQueryOver<T> And(ICriterion expression); /// <summary> + /// Add negation of criterion expressed as a lambda expression + /// </summary> + /// <param name="expression">Lambda expression</param> + /// <returns>criteria instance</returns> + IQueryOver<T> AndNot(Expression<Func<T, bool>> expression); + + /// <summary> + /// Add negation of criterion expressed as a lambda expression + /// </summary> + /// <param name="expression">Lambda expression</param> + /// <returns>criteria instance</returns> + IQueryOver<T> AndNot(Expression<Func<bool>> expression); + + /// <summary> /// Add restriction to a property /// </summary> /// <param name="expression">Lambda expression containing path to property</param> @@ -64,14 +78,14 @@ IQueryOverRestrictionBuilder<T> AndRestrictionOn(Expression<Func<object>> expression); /// <summary> - /// Identical semantics to Add() to allow more readable queries + /// Identical semantics to And() to allow more readable queries /// </summary> /// <param name="expression">Lambda expression</param> /// <returns>criteria instance</returns> IQueryOver<T> Where(Expression<Func<T, bool>> expression); /// <summary> - /// Identical semantics to Add() to allow more readable queries + /// Identical semantics to And() to allow more readable queries /// </summary> /// <param name="expression">Lambda expression</param> /// <returns>criteria instance</returns> @@ -83,6 +97,20 @@ IQueryOver<T> Where(ICriterion expression); /// <summary> + /// Identical semantics to AndNot() to allow more readable queries + /// </summary> + /// <param name="expression">Lambda expression</param> + /// <returns>criteria instance</returns> + IQueryOver<T> WhereNot(Expression<Func<T, bool>> expression); + + /// <summary> + /// Identical semantics to AndNot() to allow more readable queries + /// </summary> + /// <param name="expression">Lambda expression</param> + /// <returns>criteria instance</returns> + IQueryOver<T> WhereNot(Expression<Func<bool>> expression); + + /// <summary> /// Identical semantics to AndRestrictionOn() to allow more readable queries /// </summary> /// <param name="expression">Lambda expression</param> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-11-20 20:13:57 UTC (rev 4847) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-11-20 21:28:47 UTC (rev 4848) @@ -101,18 +101,39 @@ } [Test] + public void Negation() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .Add(Restrictions.Not(Restrictions.Eq("Name", "test name"))) + .Add(Restrictions.Not(Restrictions.Eq("personAlias.Name", "test name"))); + + Person personAlias = null; + IQueryOver<Person> actual = + CreateTestQueryOver<Person>(() => personAlias) + .AndNot(p => p.Name == "test name") + .AndNot(() => personAlias.Name == "test name"); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] public void Where_BehavesTheSameAs_And() { Person personAlias = null; QueryOver<Person> expected = (QueryOver<Person>) CreateTestQueryOver<Person>(() => personAlias) .And(() => personAlias.Name == "test name") - .And(p => p.Name == "test name"); + .And(p => p.Name == "test name") + .AndNot(() => personAlias.Name == "test name") + .AndNot(p => p.Name == "test name"); IQueryOver<Person> actual = CreateTestQueryOver<Person>(() => personAlias) .Where(() => personAlias.Name == "test name") - .Where(p => p.Name == "test name"); + .Where(p => p.Name == "test name") + .WhereNot(() => personAlias.Name == "test name") + .WhereNot(p => p.Name == "test name"); AssertCriteriaAreEqual(expected.UnderlyingCriteria, actual); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |