Skip to content

Commit e8daecb

Browse files
KrzysztofLapinskihazzik
authored andcommitted
NH-3934 - Add methods to QueryOver WhereNot and AndNot with ICriterion as parameter
1 parent dca42f1 commit e8daecb

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,16 @@ public void Negation()
167167
ICriteria expected =
168168
CreateTestCriteria(typeof(Person), "personAlias")
169169
.Add(Restrictions.Not(Restrictions.Eq("Name", "test name")))
170-
.Add(Restrictions.Not(Restrictions.Eq("personAlias.Name", "test name")));
170+
.Add(Restrictions.Not(Restrictions.Eq("personAlias.Name", "test name")))
171+
.Add(Restrictions.Not(Restrictions.Eq("Name", "not test name")));
172+
171173

172174
Person personAlias = null;
173175
IQueryOver<Person> actual =
174176
CreateTestQueryOver<Person>(() => personAlias)
175177
.AndNot(p => p.Name == "test name")
176-
.AndNot(() => personAlias.Name == "test name");
178+
.AndNot(() => personAlias.Name == "test name")
179+
.AndNot(Restrictions.Eq("Name", "not test name"));
177180

178181
AssertCriteriaAreEqual(expected, actual);
179182
}
@@ -187,14 +190,16 @@ public void Where_BehavesTheSameAs_And()
187190
.And(() => personAlias.Name == "test name")
188191
.And(p => p.Name == "test name")
189192
.AndNot(() => personAlias.Name == "test name")
190-
.AndNot(p => p.Name == "test name");
193+
.AndNot(p => p.Name == "test name")
194+
.AndNot(Restrictions.Eq("Name", "not test name"));
191195

192196
IQueryOver<Person> actual =
193197
CreateTestQueryOver<Person>(() => personAlias)
194198
.Where(() => personAlias.Name == "test name")
195199
.Where(p => p.Name == "test name")
196200
.WhereNot(() => personAlias.Name == "test name")
197-
.WhereNot(p => p.Name == "test name");
201+
.WhereNot(p => p.Name == "test name")
202+
.WhereNot(Restrictions.Eq("Name", "not test name"));
198203

199204
AssertCriteriaAreEqual(expected.UnderlyingCriteria, actual);
200205
}

src/NHibernate/Criterion/QueryOver.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,11 @@ public QueryOver<TRoot,TSubType> AndNot(Expression<Func<bool>> expression)
342342
return AddNot(expression);
343343
}
344344

345+
public QueryOver<TRoot, TSubType> AndNot(ICriterion expression)
346+
{
347+
return AddNot(expression);
348+
}
349+
345350
public QueryOverRestrictionBuilder<TRoot,TSubType> AndRestrictionOn(Expression<Func<TSubType, object>> expression)
346351
{
347352
return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body));
@@ -377,6 +382,11 @@ public QueryOver<TRoot,TSubType> WhereNot(Expression<Func<bool>> expression)
377382
return AddNot(expression);
378383
}
379384

385+
public QueryOver<TRoot, TSubType> WhereNot(ICriterion expression)
386+
{
387+
return AddNot(expression);
388+
}
389+
380390
public QueryOverRestrictionBuilder<TRoot,TSubType> WhereRestrictionOn(Expression<Func<TSubType, object>> expression)
381391
{
382392
return new QueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body));
@@ -774,7 +784,12 @@ private QueryOver<TRoot,TSubType> AddNot(Expression<Func<bool>> expression)
774784
return this;
775785
}
776786

777-
787+
private QueryOver<TRoot, TSubType> AddNot(ICriterion expression)
788+
{
789+
criteria.Add(Restrictions.Not(expression));
790+
return this;
791+
}
792+
778793
IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.And(Expression<Func<TSubType, bool>> expression)
779794
{ return And(expression); }
780795

@@ -787,7 +802,10 @@ IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.And(ICriterion expression)
787802
IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.AndNot(Expression<Func<TSubType, bool>> expression)
788803
{ return AndNot(expression); }
789804

790-
IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.AndNot(Expression<Func<bool>> expression)
805+
IQueryOver<TRoot, TSubType> IQueryOver<TRoot, TSubType>.AndNot(Expression<Func<bool>> expression)
806+
{ return AndNot(expression); }
807+
808+
IQueryOver<TRoot, TSubType> IQueryOver<TRoot, TSubType>.AndNot(ICriterion expression)
791809
{ return AndNot(expression); }
792810

793811
IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.AndRestrictionOn(Expression<Func<TSubType, object>> expression)
@@ -811,6 +829,9 @@ IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.WhereNot(Expression<Func<T
811829
IQueryOver<TRoot,TSubType> IQueryOver<TRoot,TSubType>.WhereNot(Expression<Func<bool>> expression)
812830
{ return WhereNot(expression); }
813831

832+
IQueryOver<TRoot, TSubType> IQueryOver<TRoot, TSubType>.WhereNot(ICriterion expression)
833+
{ return WhereNot(expression); }
834+
814835
IQueryOverRestrictionBuilder<TRoot,TSubType> IQueryOver<TRoot,TSubType>.WhereRestrictionOn(Expression<Func<TSubType, object>> expression)
815836
{ return new IQueryOverRestrictionBuilder<TRoot,TSubType>(this, ExpressionProcessor.FindMemberProjection(expression.Body)); }
816837

src/NHibernate/IQueryOver.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,11 @@ public interface IQueryOver<TRoot,TSubType> : IQueryOver<TRoot>
210210
/// <returns>criteria instance</returns>
211211
IQueryOver<TRoot,TSubType> AndNot(Expression<Func<bool>> expression);
212212

213+
/// <summary>
214+
/// Add negation of criterion expressed as ICriterion
215+
/// </summary>
216+
IQueryOver<TRoot, TSubType> AndNot(ICriterion expression);
217+
213218
/// <summary>
214219
/// Add restriction to a property
215220
/// </summary>
@@ -257,6 +262,11 @@ public interface IQueryOver<TRoot,TSubType> : IQueryOver<TRoot>
257262
/// <returns>criteria instance</returns>
258263
IQueryOver<TRoot,TSubType> WhereNot(Expression<Func<bool>> expression);
259264

265+
/// <summary>
266+
/// Identical semantics to AndNot() to allow more readable queries
267+
/// </summary>
268+
IQueryOver<TRoot, TSubType> WhereNot(ICriterion expression);
269+
260270
/// <summary>
261271
/// Identical semantics to AndRestrictionOn() to allow more readable queries
262272
/// </summary>

0 commit comments

Comments
 (0)