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