Skip to content

Commit 3863982

Browse files
author
Gunnar Liljas
committed
NH-3417 Unit test and fix
1 parent 1ac52c1 commit 3863982

File tree

2 files changed

+97
-10
lines changed

2 files changed

+97
-10
lines changed

src/NHibernate.Test/Linq/ProjectionsTests.cs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,83 @@ public void ProjectKnownTypeWithCollection2()
316316
Assert.That(result[0].ExpandedElement.OrderLines, Is.EquivalentTo(result[0].ProjectedProperty0));
317317
}
318318

319+
[Test]
320+
public void ProjectNestedKnownTypeWithCollection()
321+
{
322+
323+
var query = from o in db.Products
324+
select new ExpandedWrapper<Product, ExpandedWrapper<Supplier, IEnumerable<Product>>>
325+
{
326+
ExpandedElement = o,
327+
ProjectedProperty0 = new ExpandedWrapper<Supplier, IEnumerable<Product>>()
328+
{
329+
ExpandedElement = o.Supplier,
330+
ProjectedProperty0 = o.Supplier.Products,
331+
Description = "Products",
332+
ReferenceDescription = ""
333+
},
334+
Description = "Supplier",
335+
ReferenceDescription = "Supplier"
336+
};
337+
338+
var result = query.ToList();
339+
Assert.That(result.Count, Is.EqualTo(77));
340+
Assert.That(result[0].ExpandedElement.Supplier, Is.EqualTo(result[0].ProjectedProperty0.ExpandedElement));
341+
Assert.That(result[0].ExpandedElement.Supplier.Products, Is.EquivalentTo(result[0].ProjectedProperty0.ProjectedProperty0));
342+
343+
}
344+
345+
[Test]
346+
public void ProjectNestedAnonymousTypeWithCollection()
347+
{
348+
349+
var query = from o in db.Products
350+
select new
351+
{
352+
ExpandedElement = o,
353+
ProjectedProperty0 = new
354+
{
355+
ExpandedElement = o.Supplier,
356+
ProjectedProperty0 = o.Supplier.Products,
357+
Description = "Products",
358+
ReferenceDescription = ""
359+
},
360+
Description = "Supplier",
361+
ReferenceDescription = "Supplier"
362+
};
363+
364+
var result = query.ToList();
365+
Assert.That(result.Count, Is.EqualTo(77));
366+
Assert.That(result[0].ExpandedElement.Supplier, Is.EqualTo(result[0].ProjectedProperty0.ExpandedElement));
367+
Assert.That(result[0].ExpandedElement.Supplier.Products, Is.EquivalentTo(result[0].ProjectedProperty0.ProjectedProperty0));
368+
369+
}
370+
371+
[Test]
372+
public void ProjectNestedAnonymousTypeWithProjectedCollection()
373+
{
374+
375+
var query = from o in db.Products
376+
select new
377+
{
378+
ExpandedElement = o,
379+
ProjectedProperty0 = new
380+
{
381+
ExpandedElement = o.Supplier,
382+
ProjectedProperty0 = o.Supplier.Products.Select(x=>new {x.Name}),
383+
Description = "Products",
384+
ReferenceDescription = ""
385+
},
386+
Description = "Supplier",
387+
ReferenceDescription = "Supplier"
388+
};
389+
390+
var result = query.ToList();
391+
Assert.That(result.Count, Is.EqualTo(77));
392+
Assert.That(result.Single(x => x.ExpandedElement.ProductId == 1).ProjectedProperty0.ProjectedProperty0.Count(), Is.EqualTo(3));
393+
394+
}
395+
319396
[Test]
320397
public void CanProjectComplexDictionaryIndexer()
321398
{

src/NHibernate/Linq/NestedSelects/NestedSelectDetector.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,13 @@ protected override Expression VisitSubQueryExpression(SubQueryExpression express
3838

3939
protected override Expression VisitMemberExpression(MemberExpression expression)
4040
{
41-
var querySourceReferenceExpression = expression.Expression as QuerySourceReferenceExpression;
42-
if (querySourceReferenceExpression != null)
43-
{
44-
var memberType = expression.Member.GetPropertyOrFieldType();
41+
var memberType = expression.Member.GetPropertyOrFieldType();
4542

46-
if (memberType != null && memberType.IsCollectionType() && IsMappedCollection(expression.Member))
47-
{
48-
Expressions.Add(expression);
49-
}
43+
if (memberType != null && memberType.IsCollectionType() && IsChainedFromQuerySourceReference(expression) && IsMappedCollection(expression.Member))
44+
{
45+
Expressions.Add(expression);
5046
}
51-
47+
5248
return base.VisitMemberExpression(expression);
5349
}
5450

@@ -57,6 +53,20 @@ private bool IsMappedCollection(MemberInfo memberInfo)
5753
var collectionRole = memberInfo.DeclaringType.FullName + "." + memberInfo.Name;
5854

5955
return sessionFactory.GetCollectionMetadata(collectionRole) != null;
60-
}
56+
}
57+
58+
private bool IsChainedFromQuerySourceReference(MemberExpression expression)
59+
{
60+
while (expression != null)
61+
{
62+
if (expression.Expression is QuerySourceReferenceExpression)
63+
{
64+
return true;
65+
}
66+
expression = expression.Expression as MemberExpression;
67+
}
68+
69+
return false;
70+
}
6171
}
6272
}

0 commit comments

Comments
 (0)