Skip to content

Commit 5826a45

Browse files
authored
Merge pull request #31 from BlaiseD/master
Fix breaking changes from AutoMapper v8.1.0
2 parents d0c9f9d + 68e2adb commit 5826a45

File tree

6 files changed

+37
-7
lines changed

6 files changed

+37
-7
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Authors>Jimmy Bogard</Authors>
44
<LangVersion>latest</LangVersion>
5-
<VersionPrefix>2.0.1</VersionPrefix>
5+
<VersionPrefix>2.0.2</VersionPrefix>
66
<WarningsAsErrors>true</WarningsAsErrors>
77
<NoWarn>$(NoWarn);1701;1702;1591</NoWarn>
88
</PropertyGroup>

src/AutoMapper.Extensions.ExpressionMapping/AutoMapper.Extensions.ExpressionMapping.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</PropertyGroup>
1818

1919
<ItemGroup>
20-
<PackageReference Include="AutoMapper" Version="8.0.0" />
20+
<PackageReference Include="AutoMapper" Version="8.1.0" />
2121
</ItemGroup>
2222

2323
</Project>

src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,15 @@ private PropertyMap PropertyMap(MemberExpression node)
269269
? null
270270
: (!node.Member.DeclaringType.IsAssignableFrom(_typeMap.DestinationType)
271271
? null
272-
: _typeMap.GetExistingPropertyMapFor(node.Member)));
272+
: GetExistingPropertyMapFor(node.Member, _typeMap)));
273+
274+
private PropertyMap GetExistingPropertyMapFor(MemberInfo destinationProperty, TypeMap typeMap)
275+
{
276+
if (!destinationProperty.DeclaringType.IsAssignableFrom(typeMap.DestinationType))
277+
return null;
278+
279+
return typeMap.PropertyMaps.FirstOrDefault(pm => pm.DestinationName == destinationProperty.Name);
280+
}
273281

274282
private void SetSorceSubTypes(PropertyMap propertyMap)
275283
{

src/AutoMapper.Extensions.ExpressionMapping/Impl/QueryDataSourceInjection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,20 @@ public QueryDataSourceInjection(IQueryable<TSource> dataSource, IMapper mapper)
7272
public ISourceInjectedQueryable<TDestination> For<TDestination>(object parameters, params Expression<Func<TDestination, object>>[] membersToExpand)
7373
{
7474
_parameters = GetParameters(parameters);
75-
_membersToExpand = ProjectionExpression.GetMemberPaths(membersToExpand);
75+
_membersToExpand = ReflectionExtensions.GetMemberPaths(membersToExpand);
7676
return CreateQueryable<TDestination>();
7777
}
7878

7979
public ISourceInjectedQueryable<TDestination> For<TDestination>(params Expression<Func<TDestination, object>>[] membersToExpand)
8080
{
81-
_membersToExpand = ProjectionExpression.GetMemberPaths(membersToExpand);
81+
_membersToExpand = ReflectionExtensions.GetMemberPaths(membersToExpand);
8282
return CreateQueryable<TDestination>();
8383
}
8484

8585
public ISourceInjectedQueryable<TDestination> For<TDestination>(IObjectDictionary parameters, params string[] membersToExpand)
8686
{
8787
_parameters = parameters;
88-
_membersToExpand = ProjectionExpression.GetMemberPaths(typeof(TDestination), membersToExpand);
88+
_membersToExpand = ReflectionExtensions.GetMemberPaths(typeof(TDestination), membersToExpand);
8989
return CreateQueryable<TDestination>();
9090
}
9191

src/AutoMapper.Extensions.ExpressionMapping/Impl/SourceInjectedQueryProvider.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,12 @@ public TResult Execute<TResult>(Expression expression)
9494
var sourceResult = _dataSource.Provider.CreateQuery(sourceExpression);
9595
Inspector.SourceResult(sourceExpression, sourceResult);
9696

97-
destResult = new ProjectionExpression((IQueryable<TSource>)sourceResult, _mapper.ConfigurationProvider.ExpressionBuilder).To<TDestination>(_parameters, _membersToExpand);
97+
var membersToExpand = _membersToExpand.SelectMany(m => m).Distinct().ToArray();
98+
99+
var parameters = _parameters ?? new Dictionary<string, object>();
100+
var mapExpressions = _mapper.ConfigurationProvider.ExpressionBuilder.GetMapExpression(sourceResult.ElementType, typeof(TDestination), parameters, membersToExpand);
101+
102+
destResult = (IQueryable<TDestination>)mapExpressions.Aggregate(sourceResult, Select);
98103
}
99104
// case #2: query is arbitrary ("manual") projection
100105
// exaple: users.UseAsDataSource().For<UserDto>().Select(user => user.Age).ToList()
@@ -228,6 +233,14 @@ private static Expression Select(Expression source, LambdaExpression lambda)
228233
);
229234
}
230235

236+
private static IQueryable Select(IQueryable source, LambdaExpression lambda) => source.Provider.CreateQuery(
237+
Call(
238+
null,
239+
QueryableSelectMethod.MakeGenericMethod(source.ElementType, lambda.ReturnType),
240+
new[] { source.Expression, Expression.Quote(lambda) }
241+
)
242+
);
243+
231244
private object InvokeSourceQuery(Type sourceResultType, Expression sourceExpression)
232245
{
233246
var result = IsProjection<TSource>(sourceResultType)

src/AutoMapper.Extensions.ExpressionMapping/ReflectionExtensions.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Linq.Expressions;
45
using System.Reflection;
56
using AutoMapper.Internal;
67

78
namespace AutoMapper
89
{
10+
using MemberPaths = IEnumerable<IEnumerable<MemberInfo>>;
11+
912
internal static class ReflectionExtensions
1013
{
1114
public static object GetDefaultValue(this ParameterInfo parameter)
@@ -29,6 +32,12 @@ public static object GetMemberValue(this MemberInfo propertyOrField, object targ
2932
public static IEnumerable<MemberInfo> GetMemberPath(Type type, string fullMemberName)
3033
=> ReflectionHelper.GetMemberPath(type, fullMemberName);
3134

35+
public static MemberPaths GetMemberPaths(Type type, string[] membersToExpand) =>
36+
membersToExpand.Select(m => ReflectionHelper.GetMemberPath(type, m));
37+
38+
public static MemberPaths GetMemberPaths<TResult>(Expression<Func<TResult, object>>[] membersToExpand) =>
39+
membersToExpand.Select(expr => MemberVisitor.GetMemberPath(expr));
40+
3241
public static MemberInfo GetFieldOrProperty(this LambdaExpression expression)
3342
=> ReflectionHelper.GetFieldOrProperty(expression);
3443

0 commit comments

Comments
 (0)