Skip to content

Commit 0faef88

Browse files
authored
Fix for np() opererator for Nullable (e.g. DateTime) (#270)
* Fixed np() operator for DateTime / DateTime? * 14
1 parent 5e1becb commit 0faef88

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
</PropertyGroup>
55

66
<PropertyGroup>
7-
<VersionPrefix>1.0.13</VersionPrefix>
7+
<VersionPrefix>1.0.14</VersionPrefix>
88
</PropertyGroup>
99

1010
<Choose>

GitHubReleaseNotes.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
https://github.com/StefH/GitHubReleaseNotes
22

3-
GitHubReleaseNotes.exe . --output CHANGELOG.md --skip-empty-releases --language en --version 1.0.13.0
3+
GitHubReleaseNotes.exe . --output CHANGELOG.md --skip-empty-releases --language en --version 1.0.14.0

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ Expression GenerateConditional(Expression test, Expression expr1, Expression exp
11771177
// - convert expr2 to nullable
11781178
if (Constants.IsNull(expr1) && expr2.Type.GetTypeInfo().IsValueType)
11791179
{
1180-
Type nullableType = typeof(Nullable<>).MakeGenericType(expr2.Type);
1180+
Type nullableType = TypeHelper.ToNullableType(expr2.Type);
11811181
expr1 = Expression.Constant(null, nullableType);
11821182
expr2 = Expression.Convert(expr2, nullableType);
11831183
}
@@ -1187,7 +1187,7 @@ Expression GenerateConditional(Expression test, Expression expr1, Expression exp
11871187
// - convert expr1 to nullable
11881188
if (Constants.IsNull(expr2) && expr1.Type.GetTypeInfo().IsValueType)
11891189
{
1190-
Type nullableType = typeof(Nullable<>).MakeGenericType(expr1.Type);
1190+
Type nullableType = TypeHelper.ToNullableType(expr1.Type);
11911191
expr2 = Expression.Constant(null, nullableType);
11921192
expr1 = Expression.Convert(expr1, nullableType);
11931193
}

src/System.Linq.Dynamic.Core/Parser/TypeHelper.cs

+7
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,13 @@ public static bool IsNullableType(Type type)
260260
return type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>);
261261
}
262262

263+
public static Type ToNullableType(Type type)
264+
{
265+
Check.NotNull(type, nameof(type));
266+
267+
return IsNullableType(type) ? type : typeof(Nullable<>).MakeGenericType(type);
268+
}
269+
263270
public static bool IsSignedIntegralType(Type type)
264271
{
265272
return GetNumericTypeKind(type) == 2;

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

+34-2
Original file line numberDiff line numberDiff line change
@@ -1290,7 +1290,39 @@ public void ExpressionTests_NullCoalescing()
12901290
}
12911291

12921292
[Fact]
1293-
public void ExpressionTests_NullPropagating_Null()
1293+
public void ExpressionTests_NullPropagating_DateTime_Value()
1294+
{
1295+
// Arrange
1296+
var q = new[] {
1297+
new { id = 1, date1 = (DateTime?) DateTime.Now, date2 = DateTime.Now.AddDays(-1)}
1298+
}.AsQueryable();
1299+
1300+
// Act
1301+
var result = q.OrderBy(x => x.date2).Select(x => x.id).ToArray();
1302+
var resultDynamic = q.OrderBy("np(date2)").Select("id").ToDynamicArray<int>();
1303+
1304+
// Assert
1305+
Check.That(resultDynamic).ContainsExactly(result);
1306+
}
1307+
1308+
[Fact]
1309+
public void ExpressionTests_NullPropagating_NullableDateTime()
1310+
{
1311+
// Arrange
1312+
var q = new[] {
1313+
new { id = 1, date1 = (DateTime?) DateTime.Now, date2 = DateTime.Now.AddDays(-1)}
1314+
}.AsQueryable();
1315+
1316+
// Act
1317+
var result = q.OrderBy(x => x.date1).Select(x => x.id).ToArray();
1318+
var resultDynamic = q.OrderBy("np(date1)").Select("id").ToDynamicArray<int>();
1319+
1320+
// Assert
1321+
Check.That(resultDynamic).ContainsExactly(result);
1322+
}
1323+
1324+
[Fact]
1325+
public void ExpressionTests_NullPropagating_Integer_Null()
12941326
{
12951327
// Arrange
12961328
var testModels = User.GenerateSampleModels(2, true).ToList();
@@ -1306,7 +1338,7 @@ public void ExpressionTests_NullPropagating_Null()
13061338
}
13071339

13081340
[Fact]
1309-
public void ExpressionTests_NullPropagating_Value()
1341+
public void ExpressionTests_NullPropagating_Integer_Value()
13101342
{
13111343
// Arrange
13121344
var testModels = User.GenerateSampleModels(2, true).ToList();

0 commit comments

Comments
 (0)