Ejemplo n.º 1
0
        internal static void BuildSetter(
            ExpressionBuilder builder,
            BuildInfo buildInfo,
            LambdaExpression setter,
            IBuildContext into,
            List <SqlQuery.SetExpression> items,
            IBuildContext sequence)
        {
            var path = Expression.Parameter(setter.Body.Type, "p");
            var ctx  = new ExpressionContext(buildInfo.Parent, sequence, setter);

            if (setter.Body.NodeType == ExpressionType.MemberInit)
            {
                var ex = (MemberInitExpression)setter.Body;
                var p  = sequence.Parent;

                BuildSetter(builder, into, items, ctx, ex, path);

                builder.ReplaceParent(ctx, p);
            }
            else
            {
                var sqlInfo = ctx.ConvertToSql(setter.Body, 0, ConvertFlags.All);

                foreach (var info in sqlInfo)
                {
                    if (info.Members.Count == 0)
                    {
                        throw new LinqException("Object initializer expected for insert statement.");
                    }

                    if (info.Members.Count != 1)
                    {
                        throw new InvalidOperationException();
                    }

                    var member = info.Members[0];
                    var pe     = Expression.MakeMemberAccess(path, member);
                    var column = into.ConvertToSql(pe, 1, ConvertFlags.Field);
                    var expr   = info.Sql;

                    if (expr is SqlParameter)
                    {
                        SetConverter(builder.MappingSchema, member, expr);
                        //var type = member.MemberType == MemberTypes.Field ?
                        //	((FieldInfo)   member).FieldType :
                        //	((PropertyInfo)member).PropertyType;

                        //if (TypeHelper.IsEnumOrNullableEnum(type))
                        //{
                        //	var memberAccessor = TypeAccessor.GetAccessor(member.DeclaringType)[member.Name];
                        //	((SqlParameter)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
                        //}
                    }

                    items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
                }
            }
        }