Skip to content

Commit 0390b46

Browse files
committed
Entity Projection: Fixed AsEntity() for root entity
1 parent 5415567 commit 0390b46

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

src/NHibernate.Test/Async/Criteria/EntityProjectionsTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,26 @@ public async Task EntityProjectionAsSelectExpressionAsync()
228228
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
229229
}
230230
}
231+
232+
[Test]
233+
public async Task EntityProjectionAsSelectExpressionForArgumentAliasAsync()
234+
{
235+
using (var sqlLog = new SqlLogSpy())
236+
using (var session = OpenSession())
237+
{
238+
EntitySimpleChild child1 = null;
239+
var complex = await (session
240+
.QueryOver<EntityComplex>()
241+
.JoinAlias(ep => ep.Child1, () => child1)
242+
.Select(ec => ec.AsEntity())
243+
.Take(1).SingleOrDefaultAsync());
244+
245+
Assert.That(complex, Is.Not.Null);
246+
Assert.That(NHibernateUtil.IsInitialized(complex), Is.True, "Object must be initialized");
247+
Assert.That(NHibernateUtil.IsInitialized(complex.Child1), Is.False, "Object must be lazy");
248+
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
249+
}
250+
}
231251

232252
[Test]
233253
public async Task EntityProjectionLockModeAsync()

src/NHibernate.Test/Criteria/EntityProjectionsTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,26 @@ public void EntityProjectionAsSelectExpression()
217217
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
218218
}
219219
}
220+
221+
[Test]
222+
public void EntityProjectionAsSelectExpressionForArgumentAlias()
223+
{
224+
using (var sqlLog = new SqlLogSpy())
225+
using (var session = OpenSession())
226+
{
227+
EntitySimpleChild child1 = null;
228+
var complex = session
229+
.QueryOver<EntityComplex>()
230+
.JoinAlias(ep => ep.Child1, () => child1)
231+
.Select(ec => ec.AsEntity())
232+
.Take(1).SingleOrDefault();
233+
234+
Assert.That(complex, Is.Not.Null);
235+
Assert.That(NHibernateUtil.IsInitialized(complex), Is.True, "Object must be initialized");
236+
Assert.That(NHibernateUtil.IsInitialized(complex.Child1), Is.False, "Object must be lazy");
237+
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
238+
}
239+
}
220240

221241
[Test]
222242
public void EntityProjectionLockMode()

src/NHibernate/Criterion/ProjectionsExtensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,10 @@ internal static IProjection ProcessAsEntity(MethodCallExpression methodCallExpre
347347
{
348348
var expression = methodCallExpression.Arguments[0];
349349
var aliasName = ExpressionProcessor.FindMemberExpression(expression);
350-
return Projections.Entity(expression.Type, aliasName);
350+
return
351+
string.IsNullOrEmpty(aliasName)
352+
? Projections.RootEntity()
353+
: Projections.Entity(expression.Type, aliasName);
351354
}
352355
}
353356
}

0 commit comments

Comments
 (0)