public SqlExtensionParam AddParameter(SqlExtensionParam param)
            {
                var key = param.Name ?? string.Empty;

                if (!NamedParameters.TryGetValue(key, out var list))
                {
                    list = new List <SqlExtensionParam>();
                    NamedParameters.Add(key, list);
                }

                list.Add(param);
                return(param);
            }
Exemplo n.º 2
0
            SqlExtensionParam BuildExtensionParam(IDataContext dataContext, SelectQuery query, MemberInfo member, Expression[] arguments, ConvertHelper convertHelper)
            {
                var method = member as MethodInfo;
                var type   = member.GetMemberType();

                if (method != null)
                {
                    type = method.ReturnType ?? type;
                }
                else if (member is PropertyInfo)
                {
                    type = ((PropertyInfo)member).PropertyType;
                }

                var extension = new SqlExtension(type, Expression, Precedence, ChainPrecedence, IsAggregate, CanBeNull);

                SqlExtensionParam result = null;

                if (method != null)
                {
                    var parameters = method.GetParameters();

                    for (var i = 0; i < parameters.Length; i++)
                    {
                        var arg   = arguments[i];
                        var param = parameters[i];
                        var names = param.GetCustomAttributes(true).OfType <ExprParameterAttribute>()
                                    .Select(a => a.Name ?? param.Name)
                                    .Distinct()
                                    .ToArray();

                        if (names.Length > 0)
                        {
                            var sqlExpressions = arg is NewArrayExpression arrayInit
                                                                ? arrayInit.Expressions.Select(convertHelper.Convert).ToArray()
                                                                : new[] { convertHelper.Convert(arg) };

                            foreach (var name in names)
                            {
                                foreach (var sqlExpr in sqlExpressions)
                                {
                                    extension.AddParameter(name, sqlExpr);
                                }
                            }
                        }
                    }
                }

                if (BuilderType != null)
                {
                    var callBuilder = _builders.GetOrAdd(BuilderType, t =>
                    {
                        if (Activator.CreateInstance(BuilderType) is IExtensionCallBuilder res)
                        {
                            return(res);
                        }

                        throw new ArgumentException(
                            $"Type '{BuilderType}' does not implement {nameof(IExtensionCallBuilder)} interface.");
                    }
                                                         );

                    var builder = new ExtensionBuilder(Configuration, dataContext, query, extension, convertHelper, member, arguments);
                    callBuilder.Build(builder);

                    result = builder.ResultExpression != null ? new SqlExtensionParam(TokenName, builder.ResultExpression) : new SqlExtensionParam(TokenName, builder.Extension);
                }

                result = result ?? new SqlExtensionParam(TokenName, extension);

                return(result);
            }
Exemplo n.º 3
0
            SqlExtensionParam BuildExtensionParam(MappingSchema mapping, MemberInfo member, Expression[] arguments, ConvertHelper convertHelper)
            {
                var method = member as MethodInfo;
                var type   = member.GetMemberType();

                if (method != null)
                {
                    type = method.ReturnType ?? type;
                }
                else if (member is PropertyInfo)
                {
                    type = ((PropertyInfo)member).PropertyType;
                }

                var extension = new SqlExtension(type, Expression, Precedence, ChainPrecedence)
                {
                    SqlFlags = SqlFlags
                };

                SqlExtensionParam result = null;

                if (method != null)
                {
                    var parameters = method.GetParameters();

                    for (var i = 0; i < parameters.Length; i++)
                    {
                        var arg   = arguments[i];
                        var param = parameters[i];
                        var names = param.GetCustomAttributes(true).OfType <ExprParameterAttribute>()
                                    .Select(a => a.Name ?? param.Name)
                                    .Distinct()
                                    .ToArray();

                        if (names.Length > 0)
                        {
                            var arrayInit      = arg as NewArrayExpression;
                            var sqlExpressions = arrayInit != null
                                                                ? arrayInit.Expressions.Select(convertHelper.Convert).ToArray()
                                                                : new[] { convertHelper.Convert(arg) };

                            foreach (var name in names)
                            {
                                foreach (var sqlExpr in sqlExpressions)
                                {
                                    extension.AddParameter(name, sqlExpr);
                                }
                            }
                        }
                        else
                        {
                            //TODO: support of aggreagate functions
//							if (typeof(IEnumerable<>).IsSameOrParentOf(param.ParameterType))
//							{
//								var zz = convertHelper.Convert(arg);
//								convertHelper.AddTypeMapping(param.ParameterType.GetGenericArguments().First(), arg);
//								var generic = param.ParameterType.GetGenericArguments().First();
//							}
                        }
                    }
                }

                if (BuilderType != null)
                {
                    var callBuilder = _builders.GetOrAdd(BuilderType, t =>
                    {
                        var res = Activator.CreateInstance(BuilderType) as IExtensionCallBuilder;
                        if (res == null)
                        {
                            throw new ArgumentException(
                                "Type '{0}' does not implement {1} interface.".Args(BuilderType, typeof(IExtensionCallBuilder).Name));
                        }
                        return(res);
                    }
                                                         );

                    var builder = new ExtensionBuilder(Configuration, mapping, extension, convertHelper, member, arguments);
                    callBuilder.Build(builder);

                    result = builder.ResultExpression != null ? new SqlExtensionParam(TokenName, builder.ResultExpression) : new SqlExtensionParam(TokenName, builder.Extension);
                }

                result = result ?? new SqlExtensionParam(TokenName, extension);

                return(result);
            }