1
+ using System . Collections . Generic ;
2
+ using System . Linq . Dynamic . Core . Exceptions ;
3
+ using System . Linq . Dynamic . Core . Tests . Helpers . Models ;
4
+ using NFluent ;
5
+ using Xunit ;
6
+
7
+ namespace System . Linq . Dynamic . Core . Tests
8
+ {
9
+ public partial class QueryableTests
10
+ {
11
+ [ Fact ]
12
+ public void GroupJoin ( )
13
+ {
14
+ //Arrange
15
+ Person magnus = new Person { Name = "Hedlund, Magnus" } ;
16
+ Person terry = new Person { Name = "Adams, Terry" } ;
17
+ Person charlotte = new Person { Name = "Weiss, Charlotte" } ;
18
+
19
+ Pet barley = new Pet { Name = "Barley" , Owner = terry } ;
20
+ Pet boots = new Pet { Name = "Boots" , Owner = terry } ;
21
+ Pet whiskers = new Pet { Name = "Whiskers" , Owner = charlotte } ;
22
+ Pet daisy = new Pet { Name = "Daisy" , Owner = magnus } ;
23
+
24
+ var people = new List < Person > { magnus , terry , charlotte } ;
25
+ var petsList = new List < Pet > { barley , boots , whiskers , daisy } ;
26
+
27
+ //Act
28
+ var realQuery = people . AsQueryable ( ) . GroupJoin (
29
+ petsList ,
30
+ person => person ,
31
+ pet => pet . Owner ,
32
+ ( person , pets ) => new { OwnerName = person . Name , Pets = pets } ) ;
33
+
34
+ var dynamicQuery = people . AsQueryable ( ) . GroupJoin (
35
+ petsList ,
36
+ "it" ,
37
+ "Owner" ,
38
+ "new(outer.Name as OwnerName, inner as Pets)" ) ;
39
+
40
+ //Assert
41
+ var realResult = realQuery . ToArray ( ) ;
42
+
43
+ #if NETSTANDARD
44
+ var dynamicResult = dynamicQuery . ToDynamicArray < DynamicClass > ( ) ;
45
+
46
+ Assert . Equal ( realResult . Length , dynamicResult . Length ) ;
47
+ for ( int i = 0 ; i < realResult . Length ; i ++ )
48
+ {
49
+ Assert . Equal ( realResult [ i ] . OwnerName , dynamicResult [ i ] . GetDynamicPropertyValue < string > ( "OwnerName" ) ) ;
50
+ for ( int j = 0 ; j < realResult [ i ] . Pets . Count ( ) ; j ++ )
51
+ {
52
+ Assert . Equal ( realResult [ i ] . Pets . ElementAt ( j ) . Name , dynamicResult [ i ] . GetDynamicPropertyValue < IEnumerable < Pet > > ( "Pets" ) . ElementAt ( j ) . Name ) ;
53
+ }
54
+ }
55
+ #else
56
+ var dynamicResult = dynamicQuery . ToDynamicArray ( ) ;
57
+
58
+ Assert . Equal ( realResult . Length , dynamicResult . Length ) ;
59
+ for ( int i = 0 ; i < realResult . Length ; i ++ )
60
+ {
61
+ Assert . Equal ( realResult [ i ] . OwnerName , ( ( dynamic ) dynamicResult [ i ] ) . OwnerName ) ;
62
+ for ( int j = 0 ; j < realResult [ i ] . Pets . Count ( ) ; j ++ )
63
+ {
64
+ Assert . Equal ( realResult [ i ] . Pets . ElementAt ( j ) . Name , ( ( ( IEnumerable < Pet > ) ( ( dynamic ) dynamicResult [ i ] ) . Pets ) ) . ElementAt ( j ) . Name ) ;
65
+ }
66
+ }
67
+ #endif
68
+ }
69
+
70
+ [ Fact ]
71
+ public void GroupJoinOnNullableType_RightNullable ( )
72
+ {
73
+ //Arrange
74
+ Person magnus = new Person { Id = 1 , Name = "Hedlund, Magnus" } ;
75
+ Person terry = new Person { Id = 2 , Name = "Adams, Terry" } ;
76
+ Person charlotte = new Person { Id = 3 , Name = "Weiss, Charlotte" } ;
77
+
78
+ Pet barley = new Pet { Name = "Barley" , NullableOwnerId = terry . Id } ;
79
+ Pet boots = new Pet { Name = "Boots" , NullableOwnerId = terry . Id } ;
80
+ Pet whiskers = new Pet { Name = "Whiskers" , NullableOwnerId = charlotte . Id } ;
81
+ Pet daisy = new Pet { Name = "Daisy" , NullableOwnerId = magnus . Id } ;
82
+
83
+ var people = new List < Person > { magnus , terry , charlotte } ;
84
+ var petsList = new List < Pet > { barley , boots , whiskers , daisy } ;
85
+
86
+ //Act
87
+ var realQuery = people . AsQueryable ( ) . GroupJoin (
88
+ petsList ,
89
+ person => person . Id ,
90
+ pet => pet . NullableOwnerId ,
91
+ ( person , pets ) => new { OwnerName = person . Name , Pets = pets } ) ;
92
+
93
+ var dynamicQuery = people . AsQueryable ( ) . GroupJoin (
94
+ petsList ,
95
+ "it.Id" ,
96
+ "NullableOwnerId" ,
97
+ "new(outer.Name as OwnerName, inner as Pets)" ) ;
98
+
99
+ //Assert
100
+ var realResult = realQuery . ToArray ( ) ;
101
+ var dynamicResult = dynamicQuery . ToDynamicArray < DynamicClass > ( ) ;
102
+
103
+ Assert . Equal ( realResult . Length , dynamicResult . Length ) ;
104
+ for ( int i = 0 ; i < realResult . Length ; i ++ )
105
+ {
106
+ Assert . Equal ( realResult [ i ] . OwnerName , dynamicResult [ i ] . GetDynamicPropertyValue < string > ( "OwnerName" ) ) ;
107
+ for ( int j = 0 ; j < realResult [ i ] . Pets . Count ( ) ; j ++ )
108
+ {
109
+ Assert . Equal ( realResult [ i ] . Pets . ElementAt ( j ) . Name , dynamicResult [ i ] . GetDynamicPropertyValue < IEnumerable < Pet > > ( "Pets" ) . ElementAt ( j ) . Name ) ;
110
+ }
111
+ }
112
+ }
113
+
114
+ [ Fact ]
115
+ public void GroupJoinOnNullableType_LeftNullable ( )
116
+ {
117
+ //Arrange
118
+ Person magnus = new Person { NullableId = 1 , Name = "Hedlund, Magnus" } ;
119
+ Person terry = new Person { NullableId = 2 , Name = "Adams, Terry" } ;
120
+ Person charlotte = new Person { NullableId = 3 , Name = "Weiss, Charlotte" } ;
121
+
122
+ Pet barley = new Pet { Name = "Barley" , OwnerId = terry . Id } ;
123
+ Pet boots = new Pet { Name = "Boots" , OwnerId = terry . Id } ;
124
+ Pet whiskers = new Pet { Name = "Whiskers" , OwnerId = charlotte . Id } ;
125
+ Pet daisy = new Pet { Name = "Daisy" , OwnerId = magnus . Id } ;
126
+
127
+ var people = new List < Person > { magnus , terry , charlotte } ;
128
+ var petsList = new List < Pet > { barley , boots , whiskers , daisy } ;
129
+
130
+ //Act
131
+ var realQuery = people . AsQueryable ( ) . GroupJoin (
132
+ petsList ,
133
+ person => person . NullableId ,
134
+ pet => pet . OwnerId ,
135
+ ( person , pets ) => new { OwnerName = person . Name , Pets = pets } ) ;
136
+
137
+ var dynamicQuery = people . AsQueryable ( ) . GroupJoin (
138
+ petsList ,
139
+ "it.NullableId" ,
140
+ "OwnerId" ,
141
+ "new(outer.Name as OwnerName, inner as Pets)" ) ;
142
+
143
+ //Assert
144
+ var realResult = realQuery . ToArray ( ) ;
145
+ var dynamicResult = dynamicQuery . ToDynamicArray < DynamicClass > ( ) ;
146
+
147
+ Assert . Equal ( realResult . Length , dynamicResult . Length ) ;
148
+ for ( int i = 0 ; i < realResult . Length ; i ++ )
149
+ {
150
+ Assert . Equal ( realResult [ i ] . OwnerName , dynamicResult [ i ] . GetDynamicPropertyValue < string > ( "OwnerName" ) ) ;
151
+ for ( int j = 0 ; j < realResult [ i ] . Pets . Count ( ) ; j ++ )
152
+ {
153
+ Assert . Equal ( realResult [ i ] . Pets . ElementAt ( j ) . Name , dynamicResult [ i ] . GetDynamicPropertyValue < IEnumerable < Pet > > ( "Pets" ) . ElementAt ( j ) . Name ) ;
154
+ }
155
+ }
156
+ }
157
+
158
+ [ Fact ]
159
+ public void GroupJoinOnNullableType_NotSameTypesThrowsException ( )
160
+ {
161
+ var person = new Person { Id = 1 , Name = "Hedlund, Magnus" } ;
162
+ var people = new List < Person > { person } ;
163
+ var pets = new List < Pet > { new Pet { Name = "Daisy" , OwnerId = person . Id } } ;
164
+
165
+ Check . ThatCode ( ( ) =>
166
+ people . AsQueryable ( )
167
+ . GroupJoin (
168
+ pets ,
169
+ "it.Id" ,
170
+ "Name" , // This is wrong
171
+ "new(outer.Name as OwnerName, inner as Pets)" ) ) . Throws < ParseException > ( ) ;
172
+ }
173
+ }
174
+ }
0 commit comments