public static IEnumerable <PropertyDescription> Retrieve(Expression expression, Expression target) { var visitor = new GetMemberAccessesVisitor(target); visitor.Visit(expression); return(visitor.Members.Select(member => new PropertyDescription(member.Name, member.GetMemberType()))); }
public override QueryExpressions GetSubQueryExpression(ExpressionBuilder builder, Expression projection, TypeMap typeMap, ExpressionRequest request, Expression instanceParameter, TypePairCount typePairCount) { var letMapInfos = _savedPaths.Select(path => new { path.LetExpression, MapFromSource = path.GetSourceExpression(instanceParameter), Property = path.GetPropertyDescription(), path.Marker }).ToArray(); var properties = letMapInfos.Select(m => m.Property).Concat(GetMemberAccessesVisitor.Retrieve(projection, instanceParameter)); var letType = ProxyGenerator.GetSimilarType(typeof(object), properties); TypeMap letTypeMap; lock (ConfigurationProvider) { letTypeMap = TypeMapFactory.CreateTypeMap(request.SourceType, letType, typeMap.Profile); } var secondParameter = Parameter(letType, "dtoLet"); ReplaceSubQueries(); var firstExpression = builder.CreateMapExpressionCore(request, instanceParameter, typePairCount, letTypeMap, base.New()); return(new QueryExpressions(firstExpression, projection, secondParameter)); void ReplaceSubQueries() { foreach (var letMapInfo in letMapInfos) { var letProperty = letType.GetProperty(letMapInfo.Property.Name); var letPropertyMap = letTypeMap.FindOrCreatePropertyMapFor(letProperty); letPropertyMap.CustomMapExpression = Lambda(letMapInfo.LetExpression.ReplaceParameters(letMapInfo.MapFromSource), secondParameter); projection = projection.Replace(letMapInfo.Marker, MakeMemberAccess(secondParameter, letProperty)); } projection = new ReplaceMemberAccessesVisitor(instanceParameter, secondParameter).Visit(projection); } }