Skip to content

Flattened properties via IncludeMembers don't get mapped correctly in expressions #151

Open
@Xriuk

Description

This time I think this issue is related to this library.
I have a model and dtos like this:

public class Category{
  [...]
  
  public string? Name {get; set;}
}

public class Product{
  [...]
  
  public Category? Category {get; set;}
}


public class ProductDTO{
  [...]
  
  public string? CategoryName {get; set;}
}

If I create the maps "manually", everything works:

CreateMap<Product, ProductDTO>()
  [...]
  .ForMember(p => p.CategoryName, c => c.MapFrom(p => p.Category!.Name));

I can then query it regularly:

Db.Products!.UseAsDataSource(_mapper.ConfigurationProvider).For<ProductDTO>()
  .FirstOrDefault(p => p.CategoryName == "MyCategory");

But if I try to include the Category entity:

CreateMap<Category, ProductDTO>()
  [...]
  .ForMember(p => p.CategoryName, c => c.MapFrom(c => c.Name));

CreateMap<Product, ProductDTO>()
  [...]
  .IncludeMembers(p => p.Category);

Then I get an exception in the query:

'Property 'String CategoryName' is not defined for type '[...].Product' Arg_ParamName_Name'

Here's the full stack trace:

   in System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/MemberExpression.cs: riga 284
   in System.Linq.Expressions.Expression.MakeMemberAccess(Expression expression, MemberInfo member) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/MemberExpression.cs: riga 398
   in System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func) in /_/src/libraries/System.Linq/src/System/Linq/Aggregate.cs: riga 54
   in System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/MemberExpression.cs: riga 68
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.VisitBinary(BinaryExpression node) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 106
   in System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/BinaryExpression.cs: riga 310
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.VisitLambdaExpression[T](Expression`1 expression) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 170
   in System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/LambdaExpression.cs: riga 290
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func) in /_/src/libraries/System.Linq/src/System/Linq/Aggregate.cs: riga 54
   in System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/LambdaExpression.cs: riga 290
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 540
   in System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/UnaryExpression.cs: riga 84
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in System.Linq.Expressions.ExpressionVisitor.Visit(ReadOnlyCollection`1 nodes) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 69
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.GetConvertedMethodCall(MethodCallExpression node) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 76
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.VisitMethodCall(MethodCallExpression node) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 65
   in System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/MethodCallExpression.cs: riga 108
   in System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 35
   in System.Linq.Expressions.ExpressionVisitor.Visit(ReadOnlyCollection`1 nodes) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/ExpressionVisitor.cs: riga 69
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.GetConvertedMethodCall(MethodCallExpression node) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 76
   in AutoMapper.Mappers.ExpressionMapper.MappingVisitor.VisitMethodCall(MethodCallExpression node) in /_/src/AutoMapper.Extensions.ExpressionMapping/ExpressionMapper.cs: riga 65
   in System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor) in /_/src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/MethodCallExpression.cs: riga 108
   in AutoMapper.Extensions.ExpressionMapping.Impl.SourceInjectedQueryProvider`2.ConvertDestinationExpressionToSourceExpression(Expression expression) in /_/src/AutoMapper.Extensions.ExpressionMapping/Impl/SourceInjectedQueryProvider.cs: riga 320
   in AutoMapper.Extensions.ExpressionMapping.Impl.SourceInjectedQueryProvider`2.Execute[TResult](Expression expression) in /_/src/AutoMapper.Extensions.ExpressionMapping/Impl/SourceInjectedQueryProvider.cs: riga 82
   in System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source) in /_/src/libraries/System.Linq.Queryable/src/System/Linq/Queryable.cs: riga 1064

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions