Skip to content

Commit 87b452b

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

File tree

2 files changed

+77
-13
lines changed

2 files changed

+77
-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: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,80 @@
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+
}
10+
protected override MapperConfiguration CreateConfiguration() => new(c =>
11+
{
12+
c.CreateMap<Foo, FooModel>().ForMember(f => f.MyBar, opts => opts.MapFrom(src => src.Bar));
13+
c.CreateMap<Bar, BarModel>().ForMember(f => f.MyBaz, opts => opts.MapFrom(src => src.Baz));
14+
c.CreateMap<Baz, BazModel>().ForMember(f => f.FirstWidget, opts => opts.MapFrom(src => src.Widgets.FirstOrDefault()));
15+
c.CreateMap<Widget, WidgetModel>();
16+
});
17+
public class Context : LocalDbContext
18+
{
19+
public virtual DbSet<Foo> Foos { get; set; }
20+
}
21+
public class DatabaseInitializer : DropCreateDatabaseAlways<Context>
22+
{
23+
}
24+
public class Foo
25+
{
26+
public int Id { get; set; }
27+
public int BarId { get; set; }
28+
public virtual Bar Bar { get; set; }
29+
}
30+
public class Bar
31+
{
32+
public Bar() => Foos = new HashSet<Foo>();
33+
public int Id { get; set; }
34+
public int BazId { get; set; }
35+
public virtual Baz Baz { get; set; }
36+
public virtual ICollection<Foo> Foos { get; set; }
37+
}
38+
public class Baz
39+
{
40+
public Baz()
41+
{
42+
Bars = new HashSet<Bar>();
43+
Widgets = new HashSet<Widget>();
44+
}
45+
public int Id { get; set; }
46+
public virtual ICollection<Bar> Bars { get; set; }
47+
public virtual ICollection<Widget> Widgets { get; set; }
48+
}
49+
public partial class Widget
50+
{
51+
public int Id { get; set; }
52+
public int BazId { get; set; }
53+
public virtual Baz Baz { get; set; }
54+
}
55+
public class FooModel
56+
{
57+
public int Id { get; set; }
58+
public int BarId { get; set; }
59+
public BarModel MyBar { get; set; }
60+
}
61+
public class BarModel
62+
{
63+
public int Id { get; set; }
64+
public int BazId { get; set; }
65+
public BazModel MyBaz { get; set; }
66+
}
67+
public class BazModel
68+
{
69+
public int Id { get; set; }
70+
public WidgetModel FirstWidget { get; set; }
71+
}
72+
public class WidgetModel
73+
{
74+
public int Id { get; set; }
75+
public int BazId { get; set; }
76+
}
77+
}
378
public class MemberWithSubQueryProjections : IntegrationTest<MemberWithSubQueryProjections.DatabaseInitializer>
479
{
580
public class Customer

0 commit comments

Comments
 (0)