Skip to content

Commit 093c157

Browse files
committed
NH-3225 - Support for Boolean bitwise operators
1 parent 714635c commit 093c157

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/NHibernate.Test/Linq/WhereTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,28 @@ public void UsersRegisteredAtOrBeforeY2KOrNamedNHibernate()
204204
Assert.That(query.Count, Is.EqualTo(2));
205205
}
206206

207+
[Test]
208+
public void UsersRegisteredAtOrBeforeY2KAndBitwiseNamedNHibernate()
209+
{
210+
//NH-3225
211+
var query = (from user in db.Users
212+
where user.RegisteredAt <= new DateTime(2000, 1, 1) & user.Name == "nhibernate"
213+
select user).ToList();
214+
215+
Assert.That(query.Count, Is.EqualTo(1));
216+
}
217+
218+
[Test]
219+
public void UsersRegisteredAtOrBeforeY2KOrBitwiseNamedNHibernate()
220+
{
221+
//NH-3225
222+
var query = (from user in db.Users
223+
where user.RegisteredAt <= new DateTime(2000, 1, 1) | user.Name == "nhibernate"
224+
select user).ToList();
225+
226+
Assert.That(query.Count, Is.EqualTo(2));
227+
}
228+
207229
[Test]
208230
public void TestDataContext()
209231
{

src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,25 @@ protected HqlTreeNode VisitBinaryExpression(BinaryExpression expression)
224224
switch (expression.NodeType)
225225
{
226226
case ExpressionType.And:
227+
if (expression.Type == typeof(bool))
228+
{
229+
return
230+
_hqlTreeBuilder.Cast(
231+
_hqlTreeBuilder.MethodCall("band", lhs.ToArithmeticExpression(), rhs.ToArithmeticExpression()),
232+
typeof(bool));
233+
234+
}
227235
return _hqlTreeBuilder.BitwiseAnd(lhs, rhs);
228236
case ExpressionType.AndAlso:
229237
return _hqlTreeBuilder.BooleanAnd(lhs.ToBooleanExpression(), rhs.ToBooleanExpression());
230238
case ExpressionType.Or:
239+
if (expression.Type == typeof(bool))
240+
{
241+
return
242+
_hqlTreeBuilder.Cast(
243+
_hqlTreeBuilder.MethodCall("bor", lhs.ToArithmeticExpression(), rhs.ToArithmeticExpression()),
244+
typeof(bool));
245+
}
231246
return _hqlTreeBuilder.BitwiseOr(lhs, rhs);
232247
case ExpressionType.OrElse:
233248
return _hqlTreeBuilder.BooleanOr(lhs.ToBooleanExpression(), rhs.ToBooleanExpression());

0 commit comments

Comments
 (0)