コード例 #1
0
        public TResult ToSingle <TResult>(ExecutionContext executionContext)
        {
            TResult result            = default;
            var     resultType        = executionContext.Result.ResultType;
            var     dataReader        = executionContext.DataReaderWrapper;
            var     multipleResultMap = executionContext.Request.MultipleResultMap;

            if (multipleResultMap.Root != null)
            {
                var deser = _deserializerFactory.Get(executionContext, executionContext.Result.ResultType);
                result = deser.ToSingle <TResult>(executionContext);
                if (result == null)
                {
                    return(default(TResult));
                }

                dataReader.NextResult();
            }
            else
            {
                result = (TResult)executionContext.SmartSqlConfig.ObjectFactoryBuilder.GetObjectFactory(resultType,
                                                                                                        Type.EmptyTypes)(null);
            }

            foreach (var resultMap in multipleResultMap.Results)
            {
                if (resultMap == multipleResultMap.Root)
                {
                    continue;
                }

                #region Set Muti Property

                var propertyInfo    = resultType.GetProperty(resultMap.Property);
                var setProperty     = _setAccessorFactory.Create(propertyInfo);
                var deser           = _deserializerFactory.Get(executionContext, propertyInfo.PropertyType);
                var resultMapResult = TypeDeserializer.Deserialize(propertyInfo.PropertyType, deser, executionContext);
                setProperty(result, resultMapResult);

                #endregion

                if (!dataReader.NextResult())
                {
                    break;
                }
            }

            return(result);
        }
コード例 #2
0
        public async Task <TResult> ToSingeAsync <TResult>(ExecutionContext executionContext)
        {
            var valueTupleType             = typeof(TResult);
            var resultGenericTypeArguments = valueTupleType.GenericTypeArguments;
            var resultItems = new object[resultGenericTypeArguments.Length];

            for (int i = 0; i < resultGenericTypeArguments.Length; i++)
            {
                var argType = resultGenericTypeArguments[i];
                var deser   = _deserializerFactory.Get(executionContext, argType);
                resultItems[i] = TypeDeserializer.Deserialize(argType, deser, executionContext);
                if (!await executionContext.DataReaderWrapper.NextResultAsync())
                {
                    break;
                }
            }
            return((TResult)ValueTupleConvert.Convert(valueTupleType, resultItems));
        }