private static IDictionary <string, Expression> Populate(NewExpression expression) { var dataType = (StructuralDataType)DataType.FromType(expression.Type, allowCycles: true); var memberBindings = dataType.Properties.ToDictionary(p => p.Name, p => (Expression) new UnassignedExpression(p.Type.UnderlyingType)); var parameters = expression.Constructor.GetParameters(); for (var i = 0; i < expression.Arguments.Count; ++i) { var parameter = parameters[i]; var name = default(string); var mapping = parameter.GetCustomAttribute <MappingAttribute>(inherit: false); if (mapping != null) { name = mapping.Uri; } else if (expression.Members.Count == expression.Arguments.Count) { mapping = expression.Members[i].GetCustomAttribute <MappingAttribute>(inherit: false); name = mapping != null ? mapping.Uri : expression.Members[i].Name; } if (name == null) { throw new InvalidOperationException("Cannot determine parameter mapping."); } Assign(memberBindings, name, expression.Arguments[i]); } var reducer = new UnassignedExpressionReducer(); return(memberBindings.ToDictionary(kv => kv.Key, kv => reducer.Visit(kv.Value))); }
private static IDictionary <string, Expression> Populate(MemberInitExpression expression) { var dataType = (StructuralDataType)DataType.FromType(expression.Type, allowCycles: true); var memberBindings = dataType.Properties.ToDictionary(p => p.Name, p => (Expression) new UnassignedExpression(p.Type.UnderlyingType)); foreach (var binding in expression.Bindings) { switch (binding.BindingType) { case MemberBindingType.Assignment: { var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false); var name = mapping != null ? mapping.Uri : binding.Member.Name; Assign(memberBindings, name, ((MemberAssignment)binding).Expression); break; } case MemberBindingType.ListBinding: { var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false); var name = mapping != null ? mapping.Uri : binding.Member.Name; Assign( memberBindings, name, Expression.ListInit( Expression.New(GetMemberType(binding.Member)), ((MemberListBinding)binding).Initializers ) ); break; } case MemberBindingType.MemberBinding: { var mapping = binding.Member.GetCustomAttribute <MappingAttribute>(inherit: false); var name = mapping != null ? mapping.Uri : binding.Member.Name; Assign( memberBindings, name, Expression.MemberInit( Expression.New(GetMemberType(binding.Member)), ((MemberMemberBinding)binding).Bindings ) ); break; } default: throw new InvalidOperationException("Cannot extract mapped expression from binding."); } } var reducer = new UnassignedExpressionReducer(); return(memberBindings.ToDictionary(kv => kv.Key, kv => reducer.Visit(kv.Value))); }
/// <summary> /// Transforms an expression by replacing entity types. /// </summary> /// <param name="expression">The expression to transform.</param> /// <returns>An expression with entity types replaced.</returns> public override Expression Apply(Expression expression) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } var res = base.Apply(expression); res = new UnassignedExpressionReducer().Visit(res); return(res); }