File tree 3 files changed +83
-1
lines changed
NHibernate/Linq/NestedSelects
3 files changed +83
-1
lines changed Original file line number Diff line number Diff line change @@ -453,6 +453,39 @@ public async Task CanSelectConditionalEntityValueWithEntityComparisonAsync()
453
453
Assert . That ( fatherInsteadOfChild , Has . Exactly ( 2 ) . EqualTo ( "5678" ) ) ;
454
454
}
455
455
456
+ [ Test ]
457
+ public async Task CanExecuteMethodWithNullObjectAndSubselectAsync ( )
458
+ {
459
+ var list1 = await ( db . Animals . Select (
460
+ a => new
461
+ {
462
+ NullableId = ( int ? ) a . Father . Father . Id ,
463
+ } )
464
+ . ToListAsync ( ) ) ;
465
+ Assert . That ( list1 , Has . Count . GreaterThan ( 0 ) ) ;
466
+ Assert . That ( list1 [ 0 ] . NullableId , Is . Null ) ;
467
+
468
+ var list2 = await ( db . Animals . Select (
469
+ a => new
470
+ {
471
+ Descriptions = a . Children . Select ( z => z . Description )
472
+ } )
473
+ . ToListAsync ( ) ) ;
474
+ Assert . That ( list2 , Has . Count . GreaterThan ( 0 ) ) ;
475
+ Assert . That ( list2 [ 0 ] . Descriptions , Is . Not . Null ) ;
476
+
477
+ var list3 = await ( db . Animals . Select (
478
+ a => new
479
+ {
480
+ NullableId = ( int ? ) a . Father . Father . Id ,
481
+ Descriptions = a . Children . Select ( z => z . Description )
482
+ } )
483
+ . ToListAsync ( ) ) ;
484
+ Assert . That ( list3 , Has . Count . GreaterThan ( 0 ) ) ;
485
+ Assert . That ( list3 [ 0 ] . NullableId , Is . Null ) ;
486
+ Assert . That ( list3 [ 0 ] . Descriptions , Is . Not . Null ) ;
487
+ }
488
+
456
489
[ Test ]
457
490
public async Task CanSelectConditionalEntityValueWithEntityComparisonRepeatAsync ( )
458
491
{
Original file line number Diff line number Diff line change @@ -492,6 +492,39 @@ public void CanSelectConditionalEntityValueWithEntityComparison()
492
492
Assert . That ( fatherInsteadOfChild , Has . Exactly ( 2 ) . EqualTo ( "5678" ) ) ;
493
493
}
494
494
495
+ [ Test ]
496
+ public void CanExecuteMethodWithNullObjectAndSubselect ( )
497
+ {
498
+ var list1 = db . Animals . Select (
499
+ a => new
500
+ {
501
+ NullableId = ( int ? ) a . Father . Father . Id ,
502
+ } )
503
+ . ToList ( ) ;
504
+ Assert . That ( list1 , Has . Count . GreaterThan ( 0 ) ) ;
505
+ Assert . That ( list1 [ 0 ] . NullableId , Is . Null ) ;
506
+
507
+ var list2 = db . Animals . Select (
508
+ a => new
509
+ {
510
+ Descriptions = a . Children . Select ( z => z . Description )
511
+ } )
512
+ . ToList ( ) ;
513
+ Assert . That ( list2 , Has . Count . GreaterThan ( 0 ) ) ;
514
+ Assert . That ( list2 [ 0 ] . Descriptions , Is . Not . Null ) ;
515
+
516
+ var list3 = db . Animals . Select (
517
+ a => new
518
+ {
519
+ NullableId = ( int ? ) a . Father . Father . Id ,
520
+ Descriptions = a . Children . Select ( z => z . Description )
521
+ } )
522
+ . ToList ( ) ;
523
+ Assert . That ( list3 , Has . Count . GreaterThan ( 0 ) ) ;
524
+ Assert . That ( list3 [ 0 ] . NullableId , Is . Null ) ;
525
+ Assert . That ( list3 [ 0 ] . Descriptions , Is . Not . Null ) ;
526
+ }
527
+
495
528
[ Test ]
496
529
public void CanSelectConditionalEntityValueWithEntityComparisonRepeat ( )
497
530
{
Original file line number Diff line number Diff line change @@ -38,6 +38,17 @@ public override Expression Visit(Expression expression)
38
38
return base . Visit ( expression ) ;
39
39
}
40
40
41
+ protected override Expression VisitUnary ( UnaryExpression node )
42
+ {
43
+ if ( node . NodeType == ExpressionType . Convert &&
44
+ ( node . Operand is MemberExpression || node . Operand is QuerySourceReferenceExpression ) )
45
+ {
46
+ return AddAndConvertExpression ( node . Operand , node . Type ) ;
47
+ }
48
+
49
+ return base . VisitUnary ( node ) ;
50
+ }
51
+
41
52
protected override Expression VisitMember ( MemberExpression expression )
42
53
{
43
54
return AddAndConvertExpression ( expression ) ;
@@ -49,14 +60,19 @@ protected override Expression VisitQuerySourceReference(QuerySourceReferenceExpr
49
60
}
50
61
51
62
private Expression AddAndConvertExpression ( Expression expression )
63
+ {
64
+ return AddAndConvertExpression ( expression , expression . Type ) ;
65
+ }
66
+
67
+ private Expression AddAndConvertExpression ( Expression expression , System . Type type )
52
68
{
53
69
expressions . Add ( new ExpressionHolder { Expression = expression , Tuple = tuple } ) ;
54
70
55
71
return Expression . Convert (
56
72
Expression . ArrayIndex (
57
73
Expression . Property ( parameter , Tuple . ItemsProperty ) ,
58
74
Expression . Constant ( expressions . Count - 1 ) ) ,
59
- expression . Type ) ;
75
+ type ) ;
60
76
}
61
77
}
62
78
}
You can’t perform that action at this time.
0 commit comments