Example #1
0
        public void Test()
        {
            string name = null;

            SqlParameter[]           parameters = null;
            StoredProcedureAttribute attribute  = new StoredProcedureAttribute("[maprocedurestockee] @p1 Xml Input, @p2 Bit Output");

            attribute.GenerateStoredProcedure(out name, out parameters);
        }
        private void GetBodyForMethod(MethodContext methodContext)
        {
            ParameterExpression param;
            var ret  = methodContext.Return(methodContext.TaskType);
            var task = methodContext.AddVariable(typeof(Task <IDataReader>), "task");

            var parameterConverter = StoredProcedureAttribute.GetConverter(Caller);

            if (parameterConverter == null)
            {
                throw new InvalidOperationException($"Could not get parameter converter for method {Caller.Name} of type {Caller.DeclaringType.FullName}");
            }

            if (parameterConverter is DefaultParameterConverter parameterConverterInternal)
            {
                param = parameterConverterInternal.Convert(methodContext, Parameters, Caller);
            }
            else
            {
                param = CustomConverter(methodContext, parameterConverter);
            }

            var dbConnectionParameters = Caller.GetCustomAttribute <DbConnectionParametersAttribute>();

            if (dbConnectionParameters != null)
            {
                SetRequestTimeout(methodContext, param, dbConnectionParameters);
            }

            var disp = methodContext.DispatcherMethod;

            var arguments = GetDispatcherAttributes(methodContext, param, disp);

            methodContext.Do(Expression.Assign(task,
                                               disp == null ?
                                               Expression.Call(ThisParameter, _nonDispatchedSpReaderWrapperMethodInfo, arguments) :
                                               Expression.Call(ThisParameter, disp, arguments)));

            var reader = GetReaderWrapper(methodContext);

            var action   = reader.Invoke(null, new object[0]);
            var proxType = action.GetType();
            var prox     = methodContext.AddVariable(proxType, "proxy");

            methodContext.Do(prox.Assign(action));

            var invokeProx = proxType.GetMethod("Invoke");

            methodContext.Do(ret.Assign(Expression.Call(prox, invokeProx, task)));
        }