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); }
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); }
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); }