diff --git a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs index 95672bab016..ef552314347 100644 --- a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs @@ -346,9 +346,9 @@ public async Task NullableEntityProjectionAsync() var withNullManyToOneList = await (session.Query().Where(x => x.ManyToOne == null).ToListAsync()); var withNullManyToOneJoinedList = await ((from x in session.Query() - from x2 in session.Query() - where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null - select x2).ToListAsync()); + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToListAsync()); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0)); diff --git a/src/NHibernate.Test/Linq/TryGetMappedTests.cs b/src/NHibernate.Test/Linq/TryGetMappedTests.cs index 964072efdc2..87b860089b0 100644 --- a/src/NHibernate.Test/Linq/TryGetMappedTests.cs +++ b/src/NHibernate.Test/Linq/TryGetMappedTests.cs @@ -272,6 +272,19 @@ public void NestedComponentPropertyCastTest() o => o?.Name == "component[OtherProperty1]"); } + [Test(Description = "GH-2937")] + public void CompositeUserTypePropertyTest() + { + var query = session.Query().Select(o => o.Multiple.count); + AssertSupported( + query, + typeof(Glarch).FullName, + "Multiple.count", + o => o is Int32Type, + o => o?.Name == typeof(MultiplicityType).FullName, + null); + } + [Test] public void ManyToOneTest() { @@ -723,9 +736,10 @@ private void AssertSupported( string expectedEntityName, string expectedMemberPath, Predicate expectedMemberType, - Predicate expectedComponentType = null) + Predicate expectedComponentType = null, + bool? nullability = true) { - AssertResult(query, true, true, expectedEntityName, expectedMemberPath, expectedMemberType, expectedComponentType); + AssertResult(query, true, true, expectedEntityName, expectedMemberPath, expectedMemberType, expectedComponentType, nullability); } private void AssertSupported( @@ -768,7 +782,7 @@ private void AssertResult( string expectedMemberPath, Predicate expectedMemberType, Predicate expectedComponentType = null, - bool nullability = true) + bool? nullability = true) { expectedComponentType = expectedComponentType ?? (o => o == null); @@ -809,8 +823,12 @@ private void AssertResult( if (found) { - Assert.That(_tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable), Is.True, "Expression should be supported"); - Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct"); + Assert.That( + _tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable), + Is.EqualTo(nullability.HasValue), + $"Expression should be {(nullability.HasValue ? "supported" : "unsupported")}"); + if (nullability.HasValue) + Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct"); } } } diff --git a/src/NHibernate/Util/ExpressionsHelper.cs b/src/NHibernate/Util/ExpressionsHelper.cs index 050a4d2ed22..3dc7924c3f7 100644 --- a/src/NHibernate/Util/ExpressionsHelper.cs +++ b/src/NHibernate/Util/ExpressionsHelper.cs @@ -160,10 +160,17 @@ internal static bool TryGetMappedNullability( int index; if (componentType != null) { + var propertyNullability = componentType.PropertyNullability; + if (propertyNullability == null) + { + nullable = false; + return false; + } + index = Array.IndexOf( componentType.PropertyNames, memberPath.Substring(memberPath.LastIndexOf('.') + 1)); - nullable = componentType.PropertyNullability[index]; + nullable = propertyNullability[index]; return true; }