Skip to content

Commit c2f3ffe

Browse files
committed
NH-3915 - Implement bitwise not (~) in Linq Provider
1 parent 093c157 commit c2f3ffe

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

src/NHibernate.Test/Linq/SelectionTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,15 @@ public void CanSelectConditionalObject()
457457
Assert.That(fatherIsKnown, Has.Exactly(1).With.Property("FatherIsKnown").True);
458458
}
459459

460+
[Test]
461+
public void CanSelectBitwiseNot()
462+
{
463+
//NH-3915
464+
var queryable = db.Animals.Select(a => ~a.Id);
465+
466+
Assert.That(queryable.ToList(), Is.EqualTo(db.Animals.ToList().Select(a => ~a.Id).ToList()));
467+
}
468+
460469
public class Wrapper<T>
461470
{
462471
public T item;

src/NHibernate/Hql/Ast/HqlTreeBuilder.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,17 @@ public HqlCast Cast(HqlExpression expression, System.Type type)
276276
return new HqlCast(_factory, expression, type);
277277
}
278278

279+
[Obsolete]
279280
public HqlBitwiseNot BitwiseNot()
280281
{
281282
return new HqlBitwiseNot(_factory);
282283
}
283284

285+
public HqlBitwiseNot BitwiseNot(HqlExpression operand)
286+
{
287+
return new HqlBitwiseNot(_factory, operand);
288+
}
289+
284290
public HqlBooleanNot BooleanNot(HqlBooleanExpression operand)
285291
{
286292
return new HqlBooleanNot(_factory, operand);
@@ -376,7 +382,12 @@ public HqlMethodCall MethodCall(string methodName, params HqlExpression[] parame
376382
return new HqlMethodCall(_factory, methodName, parameters);
377383
}
378384

379-
public HqlBooleanMethodCall BooleanMethodCall(string methodName, IEnumerable<HqlExpression> parameters)
385+
public HqlBooleanMethodCall BooleanMethodCall(string methodName, params HqlExpression[] parameters)
386+
{
387+
return new HqlBooleanMethodCall(_factory, methodName, parameters);
388+
}
389+
390+
public HqlBooleanMethodCall BooleanMethodCall(string methodName, IEnumerable<HqlExpression> parameters)
380391
{
381392
return new HqlBooleanMethodCall(_factory, methodName, parameters);
382393
}

src/NHibernate/Hql/Ast/HqlTreeNode.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,12 @@ public HqlAverage(IASTFactory factory, HqlExpression expression)
696696

697697
public class HqlBitwiseNot : HqlExpression
698698
{
699-
public HqlBitwiseNot(IASTFactory factory) : base(HqlSqlWalker.BNOT, "not", factory)
699+
public HqlBitwiseNot(IASTFactory factory)
700+
: base(HqlSqlWalker.BNOT, "not", factory)
701+
{
702+
}
703+
public HqlBitwiseNot(IASTFactory factory, HqlExpression operand)
704+
: base(HqlSqlWalker.BNOT, "not", factory, operand)
700705
{
701706
}
702707
}

src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,9 @@ protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
393393
switch (expression.NodeType)
394394
{
395395
case ExpressionType.Not:
396-
return _hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression());
396+
if (expression.Type == typeof(bool))
397+
return _hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression());
398+
return _hqlTreeBuilder.BitwiseNot(VisitExpression(expression.Operand).AsExpression());
397399
case ExpressionType.Convert:
398400
case ExpressionType.ConvertChecked:
399401
case ExpressionType.TypeAs:

0 commit comments

Comments
 (0)