Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 27fec39

Browse files
committed
Added support for Nullable<T>.HasValue in SqlExpression - it's equivalent to "!= null"
1 parent 04fe97b commit 27fec39

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,8 +1337,18 @@ protected virtual object VisitMemberAccess(MemberExpression m)
13371337
{
13381338
if (m.Expression != null)
13391339
{
1340-
if (m.Member.DeclaringType.IsNullableType() && m.Member.Name == nameof(Nullable<bool>.Value))
1341-
return Visit(m.Expression);
1340+
if (m.Member.DeclaringType.IsNullableType())
1341+
{
1342+
if (m.Member.Name == nameof(Nullable<bool>.Value))
1343+
return Visit(m.Expression);
1344+
if (m.Member.Name == nameof(Nullable<bool>.HasValue))
1345+
{
1346+
var doesNotEqualNull = Expression.MakeBinary(ExpressionType.NotEqual, m.Expression, Expression.Constant(null));
1347+
return Visit(doesNotEqualNull); // Nullable<T>.HasValue is equivalent to "!= null"
1348+
}
1349+
1350+
throw new ArgumentException(string.Format("Expression '{0}' accesses unsupported property '{1}' of Nullable<T>", m, m.Member));
1351+
}
13421352

13431353
if (m.Expression.NodeType == ExpressionType.Parameter || m.Expression.NodeType == ExpressionType.Convert)
13441354
return GetMemberExpression(m);

tests/ServiceStack.OrmLite.Tests/ExpressionVisitorTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,18 @@ public void Can_Select_using_int_array_Contains_Value()
173173
CollectionAssert.AreEquivalent(new[] { 1, 4 }, target.Select(t => t.Id).ToArray());
174174
}
175175

176+
[Test]
177+
public void Can_Select_using_Nullable_HasValue()
178+
{
179+
var q = Db.From<TestType>().Where(x => x.NullableIntCol.HasValue); // WHERE NullableIntCol IS NOT NULL
180+
var target = Db.Select(q);
181+
CollectionAssert.AreEquivalent(new[] { 1, 3, 4 }, target.Select(t => t.Id).ToArray());
182+
183+
q = Db.From<TestType>().Where(x => !x.NullableIntCol.HasValue); // WHERE NOT (NullableIntCol IS NOT NULL)
184+
target = Db.Select(q);
185+
CollectionAssert.AreEquivalent(new[] { 2 }, target.Select(t => t.Id).ToArray());
186+
}
187+
176188
[Test]
177189
public void Can_Select_using_Startswith()
178190
{

0 commit comments

Comments
 (0)