@@ -191,6 +191,54 @@ public async Task AliasedEntityProjectionAsync()
191
191
}
192
192
}
193
193
194
+ [ Test ]
195
+ public async Task EntityProjectionAsSelectExpressionAsync ( )
196
+ {
197
+ using ( var sqlLog = new SqlLogSpy ( ) )
198
+ using ( var session = OpenSession ( ) )
199
+ {
200
+ EntitySimpleChild child1 = null ;
201
+ child1 = await ( session
202
+ . QueryOver < EntityComplex > ( )
203
+ . JoinAlias ( ep => ep . Child1 , ( ) => child1 )
204
+ . Select ( ec => child1 . AsEntity ( ) )
205
+ . Take ( 1 ) . SingleOrDefaultAsync < EntitySimpleChild > ( ) ) ;
206
+
207
+ Assert . That ( child1 , Is . Not . Null ) ;
208
+ Assert . That ( NHibernateUtil . IsInitialized ( child1 ) , Is . True , "Object must be initialized" ) ;
209
+ Assert . That ( sqlLog . Appender . GetEvents ( ) . Length , Is . EqualTo ( 1 ) , "Only one SQL select is expected" ) ;
210
+ }
211
+ }
212
+
213
+ [ Test ]
214
+ public async Task EntityProjectionLockModeAsync ( )
215
+ {
216
+ var upgradeHint = Dialect . ForUpdateString ;
217
+ if ( string . IsNullOrEmpty ( upgradeHint ) )
218
+ upgradeHint = this . Dialect . AppendLockHint ( LockMode . Upgrade , string . Empty ) ;
219
+ if ( string . IsNullOrEmpty ( upgradeHint ) )
220
+ {
221
+ Assert . Ignore ( $ "Upgrade hint is not supported by dialect { Dialect . GetType ( ) . Name } ") ;
222
+ }
223
+
224
+ using ( var sqlLog = new SqlLogSpy ( ) )
225
+ using ( var session = OpenSession ( ) )
226
+ {
227
+ EntitySimpleChild child1 = null ;
228
+ child1 = await ( session
229
+ . QueryOver < EntityComplex > ( )
230
+ . JoinAlias ( ep => ep . Child1 , ( ) => child1 )
231
+ . Lock ( ( ) => child1 ) . Upgrade
232
+ . Select ( Projections . Entity ( ( ) => child1 ) )
233
+ . Take ( 1 ) . SingleOrDefaultAsync < EntitySimpleChild > ( ) ) ;
234
+
235
+ Assert . That ( child1 , Is . Not . Null ) ;
236
+ Assert . That ( NHibernateUtil . IsInitialized ( child1 ) , Is . True , "Object must be initialized" ) ;
237
+ Assert . That ( sqlLog . Appender . GetEvents ( ) . Length , Is . EqualTo ( 1 ) , "Only one SQL select is expected" ) ;
238
+ Assert . That ( sqlLog . Appender . GetEvents ( ) [ 0 ] . RenderedMessage , Does . Contain ( upgradeHint ) ) ;
239
+ }
240
+ }
241
+
194
242
[ Test ]
195
243
public async Task MultipleLazyEntityProjectionsAsync ( )
196
244
{
@@ -313,6 +361,7 @@ class MultipleEntitiesResult
313
361
public EntitySimpleChild Child2 { get ; set ; }
314
362
public EntityComplex SameAsRootChild { get ; set ; }
315
363
public EntitySimpleChild NullListElem { get ; set ; }
364
+ public string Name { get ; set ; }
316
365
}
317
366
318
367
[ Test ]
@@ -335,9 +384,11 @@ public async Task MultipleEntitiesProjectionsToResultTransformerAsync()
335
384
. JoinAlias ( ep => ep . SameTypeChild , ( ) => sameAsRootChild )
336
385
. JoinAlias ( ep => ep . ChildrenList , ( ) => nullListElem , JoinType . LeftOuterJoin )
337
386
. Select (
338
- Projections . Alias ( Projections . RootEntity ( ) , nameof ( r . Root ) ) ,
387
+ Projections . RootEntity ( ) . WithAlias ( nameof ( r . Root ) ) ,
339
388
Projections . Entity ( ( ) => child1 ) ,
389
+ Projections . Property ( ( ) => child2 . Name ) . As ( nameof ( r . Name ) ) ,
340
390
Projections . Entity ( ( ) => child2 ) ,
391
+ Projections . Property ( ( ) => child1 . Id ) ,
341
392
Projections . Entity ( ( ) => sameAsRootChild ) ,
342
393
Projections . Entity ( ( ) => nullListElem )
343
394
)
@@ -362,7 +413,8 @@ public async Task ReadOnlyProjectionAsync()
362
413
{
363
414
EntityComplex entityRoot = await ( session
364
415
. QueryOver < EntityComplex > ( )
365
- . Select ( Projections . RootEntity ( ) . SetReadonly ( true ) )
416
+ . Select ( Projections . RootEntity ( ) )
417
+ . ReadOnly ( )
366
418
. Take ( 1 ) . SingleOrDefaultAsync ( ) ) ;
367
419
368
420
Assert . That ( session . IsReadOnly ( entityRoot ) , Is . True , "Object must be loaded readonly." ) ;
0 commit comments