@@ -21,13 +21,18 @@ namespace NHibernate.Test.Linq
21
21
{
22
22
using System . Threading . Tasks ;
23
23
using System . Threading ;
24
+ using System . Linq . Expressions ;
25
+
24
26
[ TestFixture ( typeof ( EnumType < TestEnum > ) ) ]
25
27
[ TestFixture ( typeof ( EnumStringType < TestEnum > ) ) ]
26
28
[ TestFixture ( typeof ( EnumAnsiStringType < TestEnum > ) ) ]
27
29
public class EnumTestsAsync : TestCaseMappingByCode
28
30
{
29
31
private IType _enumType ;
32
+ private ISession _session ;
30
33
34
+ private IQueryable < EnumEntity > TestEntities { get ; set ; }
35
+ private IQueryable < EnumEntity > TestEntitiesInDb { get ; set ; }
31
36
32
37
public EnumTestsAsync ( System . Type enumType )
33
38
{
@@ -43,6 +48,7 @@ protected override HbmMapping GetMappings()
43
48
rc . Table ( "EnumEntity" ) ;
44
49
rc . Id ( x => x . Id , m => m . Generator ( Generators . Identity ) ) ;
45
50
rc . Property ( x => x . Name ) ;
51
+ rc . Property ( x => x . BatchId ) ;
46
52
rc . Property ( x => x . Enum , m => m . Type ( _enumType ) ) ;
47
53
rc . Property ( x => x . NullableEnum , m => m . Type ( _enumType ) ) ;
48
54
rc . ManyToOne ( x => x . Other , m => m . Cascade ( Mapping . ByCode . Cascade . All ) ) ;
@@ -55,25 +61,43 @@ protected override HbmMapping GetMappings()
55
61
protected override void OnSetUp ( )
56
62
{
57
63
base . OnSetUp ( ) ;
58
- using ( var session = OpenSession ( ) )
59
- using ( var trans = session . BeginTransaction ( ) )
64
+ _session = OpenSession ( ) ;
65
+
66
+ var entities = new [ ] {
67
+ new EnumEntity { Enum = TestEnum . Unspecified } ,
68
+ new EnumEntity { Enum = TestEnum . Small , NullableEnum = TestEnum . Large } ,
69
+ new EnumEntity { Enum = TestEnum . Small , NullableEnum = TestEnum . Medium } ,
70
+ new EnumEntity { Enum = TestEnum . Medium , NullableEnum = TestEnum . Medium } ,
71
+ new EnumEntity { Enum = TestEnum . Medium , NullableEnum = TestEnum . Small } ,
72
+ new EnumEntity { Enum = TestEnum . Medium } ,
73
+ new EnumEntity { Enum = TestEnum . Large , NullableEnum = TestEnum . Medium } ,
74
+ new EnumEntity { Enum = TestEnum . Large , NullableEnum = TestEnum . Unspecified } ,
75
+ new EnumEntity { Enum = TestEnum . Large } ,
76
+ new EnumEntity { Enum = TestEnum . Large }
77
+ } ;
78
+
79
+ var batchId = Guid . NewGuid ( ) ;
80
+
81
+ using ( var trans = _session . BeginTransaction ( ) )
60
82
{
61
- session . Save ( new EnumEntity { Enum = TestEnum . Unspecified } ) ;
62
- session . Save ( new EnumEntity { Enum = TestEnum . Small } ) ;
63
- session . Save ( new EnumEntity { Enum = TestEnum . Small } ) ;
64
- session . Save ( new EnumEntity { Enum = TestEnum . Medium } ) ;
65
- session . Save ( new EnumEntity { Enum = TestEnum . Medium } ) ;
66
- session . Save ( new EnumEntity { Enum = TestEnum . Medium } ) ;
67
- session . Save ( new EnumEntity { Enum = TestEnum . Large } ) ;
68
- session . Save ( new EnumEntity { Enum = TestEnum . Large } ) ;
69
- session . Save ( new EnumEntity { Enum = TestEnum . Large } ) ;
70
- session . Save ( new EnumEntity { Enum = TestEnum . Large } ) ;
83
+ foreach ( var item in entities )
84
+ {
85
+ item . BatchId = batchId ;
86
+ _session . Save ( item ) ;
87
+ }
71
88
trans . Commit ( ) ;
72
89
}
90
+
91
+ TestEntitiesInDb = _session . Query < EnumEntity > ( ) . Where ( x => x . BatchId == batchId ) ;
92
+ TestEntities = entities . AsQueryable ( ) ;
73
93
}
74
94
75
95
protected override void OnTearDown ( )
76
96
{
97
+ if ( _session . IsOpen )
98
+ {
99
+ _session . Close ( ) ;
100
+ }
77
101
using ( var session = OpenSession ( ) )
78
102
using ( var transaction = session . BeginTransaction ( ) )
79
103
{
@@ -108,76 +132,68 @@ public async Task CanQueryOnEnum_Unspecified_1Async()
108
132
await ( CanQueryOnEnumAsync ( TestEnum . Unspecified , 1 ) ) ;
109
133
}
110
134
111
- private async Task CanQueryOnEnumAsync ( TestEnum type , int expectedCount , CancellationToken cancellationToken = default ( CancellationToken ) )
135
+ private async Task CanQueryOnEnumAsync ( TestEnum type , int expectedCount )
112
136
{
113
- using ( var session = OpenSession ( ) )
114
- using ( var trans = session . BeginTransaction ( ) )
115
- {
116
- var query = await ( session . Query < EnumEntity > ( ) . Where ( x => x . Enum == type ) . ToListAsync ( cancellationToken ) ) ;
137
+ var query = await ( TestEntitiesInDb . Where ( x => x . Enum == type ) . ToListAsync ( ) ) ;
117
138
118
- Assert . AreEqual ( expectedCount , query . Count ) ;
119
- }
139
+ Assert . AreEqual ( expectedCount , query . Count ) ;
120
140
}
121
141
122
142
[ Test ]
123
143
public async Task CanQueryWithContainsOnTestEnum_Small_1Async ( )
124
144
{
125
145
var values = new [ ] { TestEnum . Small , TestEnum . Medium } ;
126
- using ( var session = OpenSession ( ) )
127
- using ( var trans = session . BeginTransaction ( ) )
128
- {
129
- var query = await ( session . Query < EnumEntity > ( ) . Where ( x => values . Contains ( x . Enum ) ) . ToListAsync ( ) ) ;
130
146
131
- Assert . AreEqual ( 5 , query . Count ) ;
132
- }
147
+ var query = await ( TestEntitiesInDb . Where ( x => values . Contains ( x . Enum ) ) . ToListAsync ( ) ) ;
148
+
149
+ Assert . AreEqual ( 5 , query . Count ) ;
133
150
}
134
151
135
152
[ Test ]
136
153
public async Task ConditionalNavigationPropertyAsync ( )
137
154
{
138
155
TestEnum ? type = null ;
139
- using ( var session = OpenSession ( ) )
140
- using ( var trans = session . BeginTransaction ( ) )
141
- {
142
- var entities = session . Query < EnumEntity > ( ) ;
143
- await ( entities . Where ( o => o . Enum == TestEnum . Large ) . ToListAsync ( ) ) ;
144
- await ( entities . Where ( o => TestEnum . Large != o . Enum ) . ToListAsync ( ) ) ;
145
- await ( entities . Where ( o => ( o . NullableEnum ?? TestEnum . Large ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
146
- await ( entities . Where ( o => ( ( o . NullableEnum ?? type ) ?? o . Enum ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
147
-
148
- await ( entities . Where ( o => ( o . NullableEnum . HasValue ? o . Enum : TestEnum . Unspecified ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
149
- await ( entities . Where ( o => ( o . Enum != TestEnum . Large
156
+
157
+
158
+ await ( TestEntitiesInDb . Where ( o => o . Enum == TestEnum . Large ) . ToListAsync ( ) ) ;
159
+ await ( TestEntitiesInDb . Where ( o => TestEnum . Large != o . Enum ) . ToListAsync ( ) ) ;
160
+ await ( TestEntitiesInDb . Where ( o => ( o . NullableEnum ?? TestEnum . Large ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
161
+ await ( TestEntitiesInDb . Where ( o => ( ( o . NullableEnum ?? type ) ?? o . Enum ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
162
+
163
+ await ( TestEntitiesInDb . Where ( o => ( o . NullableEnum . HasValue ? o . Enum : TestEnum . Unspecified ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
164
+ await ( TestEntitiesInDb . Where ( o => ( o . Enum != TestEnum . Large
150
165
? ( o . NullableEnum . HasValue ? o . Enum : TestEnum . Unspecified )
151
166
: TestEnum . Small ) == TestEnum . Medium ) . ToListAsync ( ) ) ;
152
167
153
- await ( entities . Where ( o => ( o . Enum == TestEnum . Large ? o . Other : o . Other ) . Name == "test" ) . ToListAsync ( ) ) ;
154
- }
168
+ await ( TestEntitiesInDb . Where ( o => ( o . Enum == TestEnum . Large ? o . Other : o . Other ) . Name == "test" ) . ToListAsync ( ) ) ;
155
169
}
156
170
157
171
[ Test ]
158
172
public async Task CanQueryComplexExpressionOnTestEnumAsync ( )
159
173
{
160
174
var type = TestEnum . Unspecified ;
161
- using ( var session = OpenSession ( ) )
162
- using ( var trans = session . BeginTransaction ( ) )
175
+
176
+ Expression < Func < EnumEntity , bool > > predicate = user => ( user . NullableEnum == TestEnum . Large
177
+ ? TestEnum . Medium
178
+ : user . NullableEnum ?? user . Enum
179
+ ) == type ;
180
+
181
+ var query = await ( TestEntitiesInDb . Where ( predicate ) . Select ( entity => new ProjectedEnum
163
182
{
164
- var entities = session . Query < EnumEntity > ( ) ;
165
-
166
- var query = await ( ( from user in entities
167
- where ( user . NullableEnum == TestEnum . Large
168
- ? TestEnum . Medium
169
- : user . NullableEnum ?? user . Enum
170
- ) == type
171
- select new
172
- {
173
- user ,
174
- simple = user . Enum ,
175
- condition = user . Enum == TestEnum . Large ? TestEnum . Medium : user . Enum ,
176
- coalesce = user . NullableEnum ?? TestEnum . Medium
177
- } ) . ToListAsync ( ) ) ;
178
-
179
- Assert . That ( query . Count , Is . EqualTo ( 1 ) ) ;
180
- }
183
+ Entity = entity ,
184
+ Simple = entity . Enum ,
185
+ Condition = entity . Enum == TestEnum . Large ? TestEnum . Medium : entity . Enum ,
186
+ Coalesce = entity . NullableEnum ?? TestEnum . Medium
187
+ } ) . ToListAsync ( ) ) ;
188
+
189
+ var targetCount = TestEntities . Count ( predicate ) ; //the truth
190
+ Assert . That ( targetCount , Is . GreaterThan ( 0 ) ) ; //test sanity check
191
+ Assert . That ( query . Count , Is . EqualTo ( targetCount ) ) ;
192
+
193
+ Assert . That ( query , Is . All . Matches < ProjectedEnum > ( x => x . Simple == x . Entity . Enum ) ) ;
194
+ Assert . That ( query , Is . All . Matches < ProjectedEnum > ( x => x . Condition == ( x . Entity . Enum == TestEnum . Large ? TestEnum . Medium : x . Entity . Enum ) ) ) ;
195
+ Assert . That ( query , Is . All . Matches < ProjectedEnum > ( x => x . Coalesce == ( x . Entity . NullableEnum ?? TestEnum . Medium ) ) ) ;
196
+
181
197
}
182
198
183
199
public class EnumEntity
@@ -189,6 +205,7 @@ public class EnumEntity
189
205
public virtual TestEnum ? NullableEnum { get ; set ; }
190
206
191
207
public virtual EnumEntity Other { get ; set ; }
208
+ public virtual Guid BatchId { get ; set ; }
192
209
}
193
210
194
211
public enum TestEnum
@@ -218,5 +235,13 @@ public override string Name
218
235
219
236
public override SqlType SqlType => SqlTypeFactory . GetAnsiString ( 255 ) ;
220
237
}
238
+
239
+ private class ProjectedEnum
240
+ {
241
+ public TestEnum Simple { get ; internal set ; }
242
+ public TestEnum Condition { get ; internal set ; }
243
+ public TestEnum Coalesce { get ; internal set ; }
244
+ public EnumEntity Entity { get ; internal set ; }
245
+ }
221
246
}
222
247
}
0 commit comments