Skip to content

Commit 1fbdf63

Browse files
authored
Merge pull request #4402 from kev-andrews/fix-projectto-typecoercion
2 parents 50747ca + a3dd45d commit 1fbdf63

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed

src/AutoMapper/QueryableExtensions/ProjectionBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Expression CreateProjection(in ProjectionRequest request, LetPropertyMaps letPro
7777
{
7878
var sourceType = derivedMap.SourceType;
7979
var derivedRequest = request.InnerRequest(sourceType, derivedMap.DestinationType);
80-
var derivedProjection = CreateProjectionCore(derivedRequest, letPropertyMaps, derivedMap, Convert(source, sourceType));
80+
var derivedProjection = CreateProjectionCore(derivedRequest, letPropertyMaps, derivedMap, TypeAs(source, sourceType));
8181
projection = Condition(TypeIs(source, sourceType), derivedProjection, projection, projection.Type);
8282
}
8383
return projection;
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
namespace AutoMapper.IntegrationTests.Inheritance;
2+
3+
public class PolymorphismTests : IntegrationTest<PolymorphismTests.DatabaseInitializer>
4+
{
5+
public abstract class Vehicle
6+
{
7+
public int Id { get; set; }
8+
public string Name { get; set; }
9+
}
10+
11+
public class Car : Vehicle
12+
{
13+
public int AmountDoors { get; set; }
14+
}
15+
16+
public class Motorcycle : Vehicle
17+
{
18+
public bool HasSidecar { get; set; }
19+
}
20+
21+
public class Bicycle : Vehicle
22+
{
23+
public bool EBike { get; set; }
24+
}
25+
26+
public class VehicleModel
27+
{
28+
public string Name { get; set; }
29+
}
30+
31+
public class MotorcycleModel : VehicleModel
32+
{
33+
public bool HasSidecar { get; set; }
34+
}
35+
36+
public class BicycleModel : VehicleModel
37+
{
38+
public bool EBike { get; set; }
39+
}
40+
41+
public class Context : LocalDbContext
42+
{
43+
public DbSet<Vehicle> Vehicles { get; set; }
44+
45+
public DbSet<Car> Cars { get; set; }
46+
47+
public DbSet<Motorcycle> Motorcycles { get; set; }
48+
49+
public DbSet<Bicycle> Bicycles { get; set; }
50+
}
51+
52+
protected override MapperConfiguration CreateConfiguration()
53+
{
54+
return new MapperConfiguration(cfg =>
55+
{
56+
cfg.CreateMap<Vehicle, VehicleModel>()
57+
.IncludeAllDerived();
58+
59+
cfg.CreateMap<Motorcycle, MotorcycleModel>();
60+
cfg.CreateMap<Bicycle, BicycleModel>();
61+
});
62+
}
63+
64+
public class DatabaseInitializer : DropCreateDatabaseAlways<Context>
65+
{
66+
protected override void Seed(Context context)
67+
{
68+
context.Vehicles.Add(new Car { Name = "Car", AmountDoors = 4 });
69+
context.Vehicles.Add(new Bicycle { Name = "Bicycle", EBike = true });
70+
context.Vehicles.Add(new Motorcycle { Name = "Motorcycle", HasSidecar = true });
71+
72+
base.Seed(context);
73+
}
74+
}
75+
76+
[Fact]
77+
public void Should_project_base_queryable_to_derived_models_polymorphic()
78+
{
79+
using var context = new Context();
80+
var results = context.Vehicles.ProjectTo<VehicleModel>(Configuration).ToArray();
81+
results.Length.ShouldBe(3);
82+
results.ShouldContain(x => x.GetType() == typeof(VehicleModel), 1);
83+
results.ShouldContain(x => x.GetType() == typeof(BicycleModel), 1);
84+
results.ShouldContain(x => x.GetType() == typeof(MotorcycleModel), 1);
85+
}
86+
87+
[Fact]
88+
public void Should_project_derived_queryable_to_derived_models_if_derived_models_exist()
89+
{
90+
using var context = new Context();
91+
var results = context.Motorcycles.ProjectTo<MotorcycleModel>(Configuration).ToArray();
92+
results.Length.ShouldBe(1);
93+
results.ShouldContain(x => x.GetType() == typeof(MotorcycleModel), 1);
94+
}
95+
96+
[Fact]
97+
public void Should_project_derived_queryable_to_base_models_if_no_derived_models_exist()
98+
{
99+
using var context = new Context();
100+
var results = context.Cars.ProjectTo<VehicleModel>(Configuration).ToArray();
101+
results.Length.ShouldBe(1);
102+
results.ShouldContain(x => x.GetType() == typeof(VehicleModel), 1);
103+
}
104+
}

0 commit comments

Comments
 (0)