Skip to content

Commit 1dbb7f7

Browse files
committed
simple MapFrom expressions are already chained from the entity parameter
1 parent c862b54 commit 1dbb7f7

File tree

2 files changed

+89
-13
lines changed

2 files changed

+89
-13
lines changed

src/AutoMapper/QueryableExtensions/ProjectionBuilder.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -262,18 +262,7 @@ public Expression GetSourceExpression(Expression parameter)
262262
for (int index = 0; index < Members.Length - 1; index++)
263263
{
264264
var sourceMember = Members[index].Expression;
265-
if (sourceMember is LambdaExpression lambda)
266-
{
267-
sourceExpression = lambda.ReplaceParameters(sourceExpression);
268-
}
269-
else
270-
{
271-
var chain = sourceMember.GetChain();
272-
if (chain.TryPeek(out var first))
273-
{
274-
sourceExpression = sourceMember.Replace(first.Target, sourceExpression);
275-
}
276-
}
265+
sourceExpression = sourceMember is LambdaExpression lambda ? lambda.ReplaceParameters(sourceExpression) : sourceMember;
277266
}
278267
return sourceExpression;
279268
}

src/IntegrationTests/CustomMapFrom/MapObjectPropertyFromSubQuery.cs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,92 @@
11
namespace AutoMapper.IntegrationTests.CustomMapFrom;
2-
2+
public class MultipleLevelsSubquery : IntegrationTest<MultipleLevelsSubquery.DatabaseInitializer>
3+
{
4+
[Fact]
5+
public void Should_work()
6+
{
7+
using var context = new Context();
8+
var resultQuery = ProjectTo<FooModel>(context.Foos);
9+
resultQuery.Single().MyBar.MyBaz.FirstWidget.Id.ShouldBe(1);
10+
}
11+
protected override MapperConfiguration CreateConfiguration() => new(c =>
12+
{
13+
c.CreateMap<Foo, FooModel>().ForMember(f => f.MyBar, opts => opts.MapFrom(src => src.Bar));
14+
c.CreateMap<Bar, BarModel>().ForMember(f => f.MyBaz, opts => opts.MapFrom(src => src.Baz));
15+
c.CreateMap<Baz, BazModel>().ForMember(f => f.FirstWidget, opts => opts.MapFrom(src => src.Widgets.FirstOrDefault()));
16+
c.CreateMap<Widget, WidgetModel>();
17+
});
18+
public class Context : LocalDbContext
19+
{
20+
public virtual DbSet<Foo> Foos { get; set; }
21+
public virtual DbSet<Baz> Bazs { get; set; }
22+
}
23+
public class DatabaseInitializer : DropCreateDatabaseAlways<Context>
24+
{
25+
protected override void Seed(Context context)
26+
{
27+
var testBaz = new Baz();
28+
testBaz.Widgets.Add(new Widget());
29+
testBaz.Widgets.Add(new Widget());
30+
var testBar = new Bar();
31+
testBar.Foos.Add(new Foo());
32+
testBaz.Bars.Add(testBar);
33+
context.Bazs.Add(testBaz);
34+
}
35+
}
36+
public class Foo
37+
{
38+
public int Id { get; set; }
39+
public int BarId { get; set; }
40+
public virtual Bar Bar { get; set; }
41+
}
42+
public class Bar
43+
{
44+
public Bar() => Foos = new HashSet<Foo>();
45+
public int Id { get; set; }
46+
public int BazId { get; set; }
47+
public virtual Baz Baz { get; set; }
48+
public virtual ICollection<Foo> Foos { get; set; }
49+
}
50+
public class Baz
51+
{
52+
public Baz()
53+
{
54+
Bars = new HashSet<Bar>();
55+
Widgets = new HashSet<Widget>();
56+
}
57+
public int Id { get; set; }
58+
public virtual ICollection<Bar> Bars { get; set; }
59+
public virtual ICollection<Widget> Widgets { get; set; }
60+
}
61+
public partial class Widget
62+
{
63+
public int Id { get; set; }
64+
public int BazId { get; set; }
65+
public virtual Baz Baz { get; set; }
66+
}
67+
public class FooModel
68+
{
69+
public int Id { get; set; }
70+
public int BarId { get; set; }
71+
public BarModel MyBar { get; set; }
72+
}
73+
public class BarModel
74+
{
75+
public int Id { get; set; }
76+
public int BazId { get; set; }
77+
public BazModel MyBaz { get; set; }
78+
}
79+
public class BazModel
80+
{
81+
public int Id { get; set; }
82+
public WidgetModel FirstWidget { get; set; }
83+
}
84+
public class WidgetModel
85+
{
86+
public int Id { get; set; }
87+
public int BazId { get; set; }
88+
}
89+
}
390
public class MemberWithSubQueryProjections : IntegrationTest<MemberWithSubQueryProjections.DatabaseInitializer>
491
{
592
public class Customer

0 commit comments

Comments
 (0)