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