static void BuildSetter( ExpressionBuilder builder, IBuildContext into, List <SelectQuery.SetExpression> items, IBuildContext ctx, MemberInitExpression expression, Expression path) { foreach (var binding in expression.Bindings) { var member = binding.Member; if (member is MethodInfo) { member = ((MethodInfo)member).GetPropertyInfo(); } if (binding is MemberAssignment) { var ma = binding as MemberAssignment; var pe = Expression.MakeMemberAccess(path, member); if (ma.Expression is MemberInitExpression && !into.IsExpression(pe, 1, RequestFor.Field).Result) { BuildSetter( builder, into, items, ctx, (MemberInitExpression)ma.Expression, Expression.MakeMemberAccess(path, member)); } else { var column = into.ConvertToSql(pe, 1, ConvertFlags.Field); var expr = builder.ConvertToSqlExpression(ctx, ma.Expression); if (expr.ElementType == QueryElementType.SqlParameter) { var parm = (SqlParameter)expr; var field = column[0].Sql is SqlField ? (SqlField)column[0].Sql : (SqlField)((SelectQuery.Column)column[0].Sql).Expression; if (parm.DataType == DataType.Undefined) { parm.DataType = field.DataType; } } items.Add(new SelectQuery.SetExpression(column[0].Sql, expr)); } } else { throw new InvalidOperationException(); } } }
static void BuildSetter( ExpressionBuilder builder, IBuildContext into, List <SqlQuery.SetExpression> items, IBuildContext ctx, MemberInitExpression expression, Expression path) { foreach (var binding in expression.Bindings) { var member = binding.Member; if (member is MethodInfo) { member = ((MethodInfo)member).GetPropertyInfo(); } if (binding is MemberAssignment) { var ma = binding as MemberAssignment; var pe = Expression.MakeMemberAccess(path, member); if (ma.Expression is MemberInitExpression && !into.IsExpression(pe, 1, RequestFor.Field).Result) { BuildSetter( builder, into, items, ctx, (MemberInitExpression)ma.Expression, Expression.MakeMemberAccess(path, member)); } else { var column = into.ConvertToSql(pe, 1, ConvertFlags.Field); var expr = builder.ConvertToSqlExpression(ctx, ma.Expression); items.Add(new SqlQuery.SetExpression(column[0].Sql, expr)); } } else { throw new InvalidOperationException(); } } }
internal static void ParseSet( ExpressionBuilder builder, BuildInfo buildInfo, LambdaExpression extract, LambdaExpression update, IBuildContext select, SqlTable table, List <SelectQuery.SetExpression> items) { var ext = extract.Body; while (ext.NodeType == ExpressionType.Convert || ext.NodeType == ExpressionType.ConvertChecked) { ext = ((UnaryExpression)ext).Operand; } if (ext.NodeType != ExpressionType.MemberAccess || ext.GetRootObject(builder.MappingSchema) != extract.Parameters[0]) { throw new LinqException("Member expression expected for the 'Set' statement."); } var body = (MemberExpression)ext; var member = body.Member; if (member is MethodInfo) { member = ((MethodInfo)member).GetPropertyInfo(); } var members = body.GetMembers(); var name = members .Skip(1) .Select(ex => { var me = ex as MemberExpression; if (me == null) { return(null); } var m = me.Member; if (m is MethodInfo) { m = ((MethodInfo)m).GetPropertyInfo(); } return(m); }) .Where(m => m != null && !m.IsNullableValueMember()) .Select(m => m.Name) .Aggregate((s1, s2) => s1 + "." + s2); if (table != null && !table.Fields.ContainsKey(name)) { throw new LinqException("Member '{0}.{1}' is not a table column.", member.DeclaringType.Name, name); } var column = table != null ? table.Fields[name] : select.ConvertToSql( body, 1, ConvertFlags.Field)[0].Sql; //Expression.MakeMemberAccess(Expression.Parameter(member.DeclaringType, "p"), member), 1, ConvertFlags.Field)[0].Sql; var sp = select.Parent; var ctx = new ExpressionContext(buildInfo.Parent, select, update); var expr = builder.ConvertToSqlExpression(ctx, update.Body); builder.ReplaceParent(ctx, sp); items.Add(new SelectQuery.SetExpression(column, expr)); }