diff --git a/src/AutoMapper/Internal/MemberVisitor.cs b/src/AutoMapper/Internal/MemberVisitor.cs index e1deb53ac6..693963a251 100644 --- a/src/AutoMapper/Internal/MemberVisitor.cs +++ b/src/AutoMapper/Internal/MemberVisitor.cs @@ -16,10 +16,11 @@ public static IEnumerable GetMemberPath(Expression expression) protected override Expression VisitMember(MemberExpression node) { - MemberPath = node.GetMembers().Select(e=>e.Member); + _members.AddRange(node.GetMembers().Select(e => e.Member)); return node; } - public IEnumerable MemberPath { get; private set; } + private readonly List _members = new List(); + public IEnumerable MemberPath => _members; } } \ No newline at end of file diff --git a/src/IntegrationTests/ExplicitExpansion/ExplicitlyExpandCollectionsAndChildReferences.cs b/src/IntegrationTests/ExplicitExpansion/ExplicitlyExpandCollectionsAndChildReferences.cs new file mode 100644 index 0000000000..7855b9e2be --- /dev/null +++ b/src/IntegrationTests/ExplicitExpansion/ExplicitlyExpandCollectionsAndChildReferences.cs @@ -0,0 +1,114 @@ +using AutoMapper.UnitTests; +using Shouldly; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Data.Entity; +using System.Diagnostics; +using System.Linq; +using Xunit; + +namespace AutoMapper.IntegrationTests.Net4 +{ + public class ExplicitlyExpandCollectionsAndChildReferences : AutoMapperSpecBase + { + TrainingCourseDto _course; + + protected override MapperConfiguration Configuration => new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap().ForMember(c => c.Content, o => o.ExplicitExpansion()); + cfg.CreateMap().ForMember(c => c.Category, o => o.ExplicitExpansion()); + }); + + protected override void Because_of() + { + using (var context = new ClientContext()) + { + context.Database.Log = s => Trace.WriteLine(s); + _course = ProjectTo(context.TrainingCourses, null, c => c.Content.Select(co => co.Category)).FirstOrDefault(n => n.CourseName == "Course 1"); + } + } + + + [Fact] + public void Should_expand_collections_items() + { + _course.Content[0].Category.CategoryName.ShouldBe("Category 1"); + } + + class Initializer : DropCreateDatabaseAlways + { + protected override void Seed(ClientContext context) + { + var category = new Category { CategoryName = "Category 1" }; + var course = new TrainingCourse { CourseName = "Course 1" }; + context.TrainingCourses.Add(course); + var content = new TrainingContent { ContentName = "Content 1", Category = category }; + context.TrainingContents.Add(content); + course.Content.Add(content); + } + } + + class ClientContext : DbContext + { + public ClientContext() + { + Database.SetInitializer(new Initializer()); + } + public DbSet Categories { get; set; } + public DbSet TrainingCourses { get; set; } + public DbSet TrainingContents { get; set; } + } + + public class TrainingCourse + { + [Key] + public int CourseId { get; set; } + + public string CourseName { get; set; } + + public virtual IList Content { get; set; } = new List(); + } + + public class TrainingContent + { + [Key] + public int ContentId { get; set; } + + public string ContentName { get; set; } + + public Category Category { get; set; } + } + + public class Category + { + public int CategoryId { get; set; } + public string CategoryName { get; set; } + } + + + public class TrainingCourseDto + { + public int CourseId { get; set; } + + public string CourseName { get; set; } + + public virtual IList Content { get; set; } + } + + public class CategoryDto + { + public int CategoryId { get; set; } + public string CategoryName { get; set; } + } + + public class TrainingContentDto + { + public int ContentId { get; set; } + + public string ContentName { get; set; } + + public CategoryDto Category { get; set; } + } + } +}