@@ -25,8 +25,7 @@ public enum BudgetType
2525 }
2626
2727 [ HierarchyRoot ]
28- public class Manager
29- : Entity
28+ public class Manager : Entity
3029 {
3130 [ Field , Key ]
3231 public int Id { get ; private set ; }
@@ -36,11 +35,15 @@ public class Manager
3635
3736 [ Field , Association ( PairTo = "Manager" ) ]
3837 public EntitySet < Person > Persons { get ; private set ; }
38+
39+ public Manager ( Session session )
40+ : base ( session )
41+ {
42+ }
3943 }
4044
4145 [ HierarchyRoot ]
42- public class Person
43- : Entity
46+ public class Person : Entity
4447 {
4548 [ Field , Key ]
4649 public int Id { get ; private set ; }
@@ -56,6 +59,11 @@ public class Person
5659
5760 [ Field ]
5861 public BudgetType ? BudgetType { get ; set ; }
62+
63+ public Person ( Session session )
64+ : base ( session )
65+ {
66+ }
5967 }
6068
6169 public class ManagerDto
@@ -90,7 +98,7 @@ public void MainTest()
9098 {
9199 using ( var session = Domain . OpenSession ( ) )
92100 using ( var t = session . OpenTransaction ( ) ) {
93- var alex = new Person ( ) { Name = "Alex" } ;
101+ var alex = new Person ( session ) { Name = "Alex" } ;
94102 var query = session . Query . All < Person > ( )
95103 . Select ( p => new PersonDto { Name = p . Name } )
96104 . Where ( personDto => personDto . Name == "Alex" ) ;
@@ -105,8 +113,8 @@ public void WhereTest()
105113 {
106114 using ( var session = Domain . OpenSession ( ) )
107115 using ( var t = session . OpenTransaction ( ) ) {
108- var person5 = new Person ( ) { Name = "John" , Tag = 5 , BudgetType = BudgetType . Regional } ;
109- var personEmpty = new Person ( ) { Name = "John" } ;
116+ var person5 = new Person ( session ) { Name = "John" , Tag = 5 , BudgetType = BudgetType . Regional } ;
117+ var personEmpty = new Person ( session ) { Name = "John" } ;
110118
111119 var count = session . Query . All < Person > ( )
112120 . Select ( p => new PersonDto ( ) { Id = p . Id , Name = p . Name , Tag = p . Tag , BudgetType = p . BudgetType } )
@@ -118,24 +126,58 @@ public void WhereTest()
118126 [ Test ]
119127 public void EnumTest ( )
120128 {
129+ BudgetType budgetType = BudgetType . Regional ;
130+ BudgetType budgetTypeNotNullable = BudgetType . State ;
131+ BudgetType ? budgetTypeNullable = BudgetType . Default ;
132+ BudgetType ? nullBudgetType = null ;
133+
121134 using ( var session = Domain . OpenSession ( ) )
122135 using ( var t = session . OpenTransaction ( ) ) {
123- BudgetType budgetType = BudgetType . Regional ;
124- BudgetType budgetTypeNotNullable = BudgetType . Regional ;
125- BudgetType ? budgetTypeNullable = BudgetType . Regional ;
136+ _ = new Person ( session ) { Name = "A" , BudgetType = BudgetType . Default } ;
137+ _ = new Person ( session ) { Name = "B" , BudgetType = BudgetType . Default } ;
138+ _ = new Person ( session ) { Name = "C" , BudgetType = BudgetType . Regional } ;
139+ _ = new Person ( session ) { Name = "D" , BudgetType = BudgetType . State } ;
140+ _ = new Person ( session ) { Name = "E" } ;
141+ _ = new Person ( session ) { Name = "F" } ;
142+ _ = new Person ( session ) { Name = null } ;
143+ _ = new Person ( session ) { Name = null } ;
144+
145+ session . SaveChanges ( ) ;
146+
126147 Expression < Func < Person , bool > > filterExpression = p => p . BudgetType == budgetType ;
148+ var regionalBudgetPeople = session . Query . All < Person > ( ) . Where ( filterExpression ) . ToList ( ) ;
149+ Assert . That ( regionalBudgetPeople . Count , Is . EqualTo ( 1 ) ) ;
150+ Assert . That ( regionalBudgetPeople [ 0 ] . Name , Is . EqualTo ( "C" ) ) ;
151+
152+ Expression < Func < Person , bool > > filterNotNullableExpression = p => p . BudgetType == budgetTypeNotNullable ;
153+ var stateBudgetPeople = session . Query . All < Person > ( ) . Where ( filterNotNullableExpression ) . ToList ( ) ;
154+ Assert . That ( stateBudgetPeople . Count , Is . EqualTo ( 1 ) ) ;
155+ Assert . That ( stateBudgetPeople [ 0 ] . Name , Is . EqualTo ( "D" ) ) ;
156+
127157 Expression < Func < Person , bool > > filterNullableExpression = p => p . BudgetType == budgetTypeNullable ;
128- Expression < Func < Person , bool > > filterNotNullableExpression = p => budgetTypeNotNullable == budgetType ;
158+ var defaultBudgetPeople = session . Query . All < Person > ( ) . Where ( filterNullableExpression ) . ToList ( ) ;
159+ Assert . That ( defaultBudgetPeople . Count , Is . EqualTo ( 2 ) ) ;
160+ Assert . That ( defaultBudgetPeople [ 0 ] . Name , Is . EqualTo ( "A" ) . Or . EqualTo ( "B" ) ) ;
161+ Assert . That ( defaultBudgetPeople [ 1 ] . Name , Is . EqualTo ( "A" ) . Or . EqualTo ( "B" ) ) ;
162+
163+ Expression < Func < Person , bool > > filterNullExpression = p => p . BudgetType == nullBudgetType ;
164+ var undefinedBudgetPeople = session . Query . All < Person > ( ) . Where ( filterNullExpression ) . ToList ( ) ;
165+ Assert . That ( undefinedBudgetPeople . Count , Is . EqualTo ( 4 ) ) ;
166+ foreach ( var person in undefinedBudgetPeople ) {
167+ Assert . That ( undefinedBudgetPeople [ 0 ] . Name , Is . EqualTo ( "E" ) . Or . EqualTo ( "F" ) . Or . EqualTo ( null ) ) ;
168+ }
169+
129170 Expression < Func < Person , BudgetType ? > > propertyExpression = p => p . BudgetType ;
130171 var valueExpression = Expression . Convert ( Expression . Constant ( budgetType ) , typeof ( BudgetType ? ) ) ;
131172 var body = Expression . Convert ( propertyExpression . Body , typeof ( BudgetType ? ) ) ;
132- Expression < Func < Person , bool > > customFilterExpression = Expression . Lambda < Func < Person , bool > > (
173+ var customFilterExpression = Expression . Lambda < Func < Person , bool > > (
133174 Expression . Equal ( body , valueExpression ) ,
134175 propertyExpression . Parameters ) ;
135- var persons = session . Query . All < Person > ( ) . Where ( filterExpression ) . ToList ( ) ;
136- var customPersons = session . Query . All < Person > ( ) . Where ( customFilterExpression ) . ToList ( ) ;
176+ var customFilterExpressionResults = session . Query . All < Person > ( ) . Where ( customFilterExpression ) . ToList ( ) ;
177+ Assert . That ( customFilterExpressionResults . OrderBy ( p => p . Id ) . SequenceEqual ( regionalBudgetPeople . OrderBy ( p => p . Id ) ) , Is . True ) ;
178+
137179 var func = customFilterExpression . Compile ( ) ;
138- func ( new Person ( ) { BudgetType = BudgetType . Regional } ) ;
180+ Assert . That ( func ( new Person ( session ) { BudgetType = BudgetType . Regional } ) , Is . True ) ;
139181 }
140182 }
141183
@@ -144,14 +186,14 @@ public void SelectNullableTest()
144186 {
145187 using ( var session = Domain . OpenSession ( ) )
146188 using ( var t = session . OpenTransaction ( ) ) {
147- var manager1 = new Manager ( ) { Name = "M0" } ;
148- var manager2 = new Manager ( ) { Name = "M0" } ;
149- new Person ( ) { Name = "A" , Manager = manager1 } ;
150- new Person ( ) { Name = "B" , Manager = manager1 } ;
151- new Person ( ) { Name = "C" , Manager = manager2 } ;
152- new Person ( ) { Name = "D" , Manager = manager2 } ;
153- new Person ( ) { Name = "E" } ;
154- new Person ( ) { Name = "F" } ;
189+ var manager1 = new Manager ( session ) { Name = "M0" } ;
190+ var manager2 = new Manager ( session ) { Name = "M0" } ;
191+ _ = new Person ( session ) { Name = "A" , Manager = manager1 } ;
192+ _ = new Person ( session ) { Name = "B" , Manager = manager1 } ;
193+ _ = new Person ( session ) { Name = "C" , Manager = manager2 } ;
194+ _ = new Person ( session ) { Name = "D" , Manager = manager2 } ;
195+ _ = new Person ( session ) { Name = "E" } ;
196+ _ = new Person ( session ) { Name = "F" } ;
155197
156198 var query = session . Query . All < Person > ( )
157199 . Select ( p => new PersonDto {
@@ -169,12 +211,12 @@ public void GroupByTest()
169211 Require . AllFeaturesSupported ( ProviderFeatures . ScalarSubqueries ) ;
170212 using ( var session = Domain . OpenSession ( ) )
171213 using ( var t = session . OpenTransaction ( ) ) {
172- new Person ( ) { Name = "A" , BudgetType = BudgetType . Default } ;
173- new Person ( ) { Name = "B" , BudgetType = BudgetType . Default } ;
174- new Person ( ) { Name = "C" , BudgetType = BudgetType . Regional } ;
175- new Person ( ) { Name = "D" , BudgetType = BudgetType . State } ;
176- new Person ( ) { Name = "E" } ;
177- new Person ( ) { Name = "F" } ;
214+ _ = new Person ( session ) { Name = "A" , BudgetType = BudgetType . Default } ;
215+ _ = new Person ( session ) { Name = "B" , BudgetType = BudgetType . Default } ;
216+ _ = new Person ( session ) { Name = "C" , BudgetType = BudgetType . Regional } ;
217+ _ = new Person ( session ) { Name = "D" , BudgetType = BudgetType . State } ;
218+ _ = new Person ( session ) { Name = "E" } ;
219+ _ = new Person ( session ) { Name = "F" } ;
178220
179221 var types = session . Query . All < Person > ( )
180222 . Select ( p => p . BudgetType )
@@ -203,24 +245,33 @@ public void MethodProjectionTest()
203245 {
204246 using ( var session = Domain . OpenSession ( ) )
205247 using ( var t = session . OpenTransaction ( ) ) {
206- new Person ( ) { Name = "A" , BudgetType = BudgetType . Default } ;
207- new Person ( ) { Name = "B" , BudgetType = BudgetType . Default } ;
208- new Person ( ) { Name = "C" , BudgetType = BudgetType . Regional } ;
209- new Person ( ) { Name = "D" , BudgetType = BudgetType . State } ;
210- new Person ( ) { Name = "E" } ;
211- new Person ( ) { Name = "F" } ;
212- new Person ( ) { Name = null } ;
213- new Person ( ) { Name = null } ;
248+ _ = new Person ( session ) { Name = "A" , BudgetType = BudgetType . Default } ;
249+ _ = new Person ( session ) { Name = "B" , BudgetType = BudgetType . Default } ;
250+ _ = new Person ( session ) { Name = "C" , BudgetType = BudgetType . Regional } ;
251+ _ = new Person ( session ) { Name = "D" , BudgetType = BudgetType . State } ;
252+ _ = new Person ( session ) { Name = "E" } ;
253+ _ = new Person ( session ) { Name = "F" } ;
254+ _ = new Person ( session ) { Name = null } ;
255+ _ = new Person ( session ) { Name = null } ;
214256
215257 var selectedMethod = session . Query . All < Person > ( )
216258 . Select ( p => new PersonDto ( ) { Id = p . Id , Name = p . Name , Description = GetDescription ( p ) } )
217259 . OrderBy ( x => x . Name )
218260 . ToList ( ) ;
219261
262+ Assert . That ( selectedMethod . Count , Is . EqualTo ( 8 ) ) ;
263+ Assert . That ( selectedMethod [ 0 ] . Name , Is . Null ) ;
264+ Assert . That ( selectedMethod [ 1 ] . Name , Is . Null ) ;
265+ Assert . That ( selectedMethod . Skip ( 2 ) . Select ( dto => dto . Name ) . SequenceEqual ( new [ ] { "A" , "B" , "C" , "D" , "E" , "F" } ) , Is . True ) ;
266+
220267 var selectedMethod2 = session . Query . All < Person > ( )
221268 . Select ( p => new PersonDto ( ) { Id = p . Id , Name = p . Name , Description = p . Name ?? GetDescription ( p ) } )
222269 . Where ( x => x . Name == null )
223270 . ToList ( ) ;
271+
272+ Assert . That ( selectedMethod2 . Count , Is . EqualTo ( 2 ) ) ;
273+ Assert . That ( selectedMethod2 [ 0 ] . Name , Is . Null ) ;
274+ Assert . That ( selectedMethod2 [ 1 ] . Name , Is . Null ) ;
224275 }
225276 }
226277
@@ -230,18 +281,18 @@ public void FirstOrDefaultTest()
230281 Require . AllFeaturesSupported ( ProviderFeatures . ScalarSubqueries ) ;
231282 using ( var session = Domain . OpenSession ( ) )
232283 using ( var t = session . OpenTransaction ( ) ) {
233- var manager = new Manager ( ) {
284+ var manager = new Manager ( session ) {
234285 Name = "Manager"
235286 } ;
236- var looser = new Manager ( ) {
287+ var looser = new Manager ( session ) {
237288 Name = "Looser"
238289 } ;
239- new Person ( ) { Name = "A" , BudgetType = BudgetType . Default , Manager = manager } ;
240- new Person ( ) { Name = "B" , BudgetType = BudgetType . Default , Manager = manager } ;
241- new Person ( ) { Name = "C" , BudgetType = BudgetType . Regional , Manager = manager } ;
242- new Person ( ) { Name = "D" , BudgetType = BudgetType . State , Manager = manager } ;
243- new Person ( ) { Name = "E" } ;
244- new Person ( ) { Name = "F" } ;
290+ _ = new Person ( session ) { Name = "A" , BudgetType = BudgetType . Default , Manager = manager } ;
291+ _ = new Person ( session ) { Name = "B" , BudgetType = BudgetType . Default , Manager = manager } ;
292+ _ = new Person ( session ) { Name = "C" , BudgetType = BudgetType . Regional , Manager = manager } ;
293+ _ = new Person ( session ) { Name = "D" , BudgetType = BudgetType . State , Manager = manager } ;
294+ _ = new Person ( session ) { Name = "E" } ;
295+ _ = new Person ( session ) { Name = "F" } ;
245296
246297 var list = session . Query . All < Manager > ( )
247298 . Select ( m => new { Entity = m , FirstPerson = m . Persons . FirstOrDefault ( ) } )
@@ -250,6 +301,14 @@ public void FirstOrDefaultTest()
250301 FirstPersonId = g . FirstPerson != null ? ( int ? ) g . FirstPerson . Id : null ,
251302 } )
252303 . ToList ( ) ;
304+
305+ Assert . That ( list . Count , Is . EqualTo ( 2 ) ) ;
306+ foreach ( var dto in list ) {
307+ var constraint = ( dto . Id == looser . Id )
308+ ? Is . Null
309+ : Is . Not . Null ;
310+ Assert . That ( dto . FirstPersonId , constraint ) ;
311+ }
253312 }
254313 }
255314
0 commit comments