Skip to content

Commit f6281cd

Browse files
committed
Merge branch 'gliljas-NH-3417'
2 parents c55a4f1 + 0b4b235 commit f6281cd

File tree

2 files changed

+95
-9
lines changed

2 files changed

+95
-9
lines changed

src/NHibernate.Test/Linq/ProjectionsTests.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,80 @@ 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+
var query = from o in db.Products
323+
select new ExpandedWrapper<Product, ExpandedWrapper<Supplier, IEnumerable<Product>>>
324+
{
325+
ExpandedElement = o,
326+
ProjectedProperty0 = new ExpandedWrapper<Supplier, IEnumerable<Product>>
327+
{
328+
ExpandedElement = o.Supplier,
329+
ProjectedProperty0 = o.Supplier.Products,
330+
Description = "Products",
331+
ReferenceDescription = ""
332+
},
333+
Description = "Supplier",
334+
ReferenceDescription = "Supplier"
335+
};
336+
337+
var result = query.ToList();
338+
Assert.That(result, Has.Count.EqualTo(77));
339+
Assert.That(result[0].ExpandedElement.Supplier, Is.EqualTo(result[0].ProjectedProperty0.ExpandedElement));
340+
Assert.That(result[0].ExpandedElement.Supplier.Products,
341+
Is.EquivalentTo(result[0].ProjectedProperty0.ProjectedProperty0));
342+
}
343+
344+
[Test]
345+
public void ProjectNestedAnonymousTypeWithCollection()
346+
{
347+
var query = from o in db.Products
348+
select new
349+
{
350+
ExpandedElement = o,
351+
ProjectedProperty0 = new
352+
{
353+
ExpandedElement = o.Supplier,
354+
ProjectedProperty0 = o.Supplier.Products,
355+
Description = "Products",
356+
ReferenceDescription = ""
357+
},
358+
Description = "Supplier",
359+
ReferenceDescription = "Supplier"
360+
};
361+
362+
var result = query.ToList();
363+
Assert.That(result, Has.Count.EqualTo(77));
364+
Assert.That(result[0].ExpandedElement.Supplier, Is.EqualTo(result[0].ProjectedProperty0.ExpandedElement));
365+
Assert.That(result[0].ExpandedElement.Supplier.Products,
366+
Is.EquivalentTo(result[0].ProjectedProperty0.ProjectedProperty0));
367+
}
368+
369+
[Test]
370+
public void ProjectNestedAnonymousTypeWithProjectedCollection()
371+
{
372+
var query = from o in db.Products
373+
select new
374+
{
375+
ExpandedElement = o,
376+
ProjectedProperty0 = new
377+
{
378+
ExpandedElement = o.Supplier,
379+
ProjectedProperty0 = o.Supplier.Products.Select(x => new {x.Name}),
380+
Description = "Products",
381+
ReferenceDescription = ""
382+
},
383+
Description = "Supplier",
384+
ReferenceDescription = "Supplier"
385+
};
386+
387+
var result = query.ToList();
388+
Assert.That(result, Has.Count.EqualTo(77));
389+
Assert.That(result.Single(x => x.ExpandedElement.ProductId == 1).ProjectedProperty0.ProjectedProperty0.Count(),
390+
Is.EqualTo(3));
391+
}
392+
319393
[Test]
320394
public void CanProjectComplexDictionaryIndexer()
321395
{

src/NHibernate/Linq/NestedSelects/NestedSelectDetector.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +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()
44+
&& IsChainedFromQuerySourceReference(expression)
45+
&& IsMappedCollection(expression.Member))
46+
{
47+
Expressions.Add(expression);
5048
}
5149

5250
return base.VisitMemberExpression(expression);
@@ -57,6 +55,20 @@ private bool IsMappedCollection(MemberInfo memberInfo)
5755
var collectionRole = memberInfo.DeclaringType.FullName + "." + memberInfo.Name;
5856

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

0 commit comments

Comments
 (0)