Пример #1
0
        /// <summary>
        /// Processes the specified <see cref="IDataReader"/>
        /// when a ResultMap is specified on the statement.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="resultObject">The result object.</param>
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object outObject = resultObject;

            IResultMap resultMap = request.CurrentResultMap.ResolveSubMap(reader);

            //查询返回结果带构造函数的类
            if (outObject == null)
            {
                object[] parameters = null;
                if (resultMap.Parameters.Count > 0)
                {
                    parameters = new object[resultMap.Parameters.Count];
                    // Fill parameters array
                    for (int index = 0; index < resultMap.Parameters.Count; index++)
                    {
                        ResultProperty resultProperty = resultMap.Parameters[index];
                        parameters[index] = resultProperty.GetValue(request, ref reader, null);
                    }
                }

                outObject = resultMap.CreateInstanceOfResult(parameters);
            }

            // For each Property in the ResultMap, set the property in the object
            for (int index = 0; index < resultMap.Properties.Count; index++)
            {
                ResultProperty property = resultMap.Properties[index];
                property.PropertyStrategy.Set(request, resultMap, property, ref outObject, reader, null);
            }

            return(outObject);
        }
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object     target    = resultObject;
            IResultMap resultMap = request.CurrentResultMap.ResolveSubMap(reader);

            if (target == null)
            {
                object[] parameters = null;
                if (resultMap.Parameters.Count > 0)
                {
                    parameters = new object[resultMap.Parameters.Count];
                    for (int j = 0; j < resultMap.Parameters.Count; j++)
                    {
                        ResultProperty mapping = resultMap.Parameters[j];
                        parameters[j] = mapping.ArgumentStrategy.GetValue(request, mapping, ref reader, null);
                    }
                }
                target = resultMap.CreateInstanceOfResult(parameters);
            }
            for (int i = 0; i < resultMap.Properties.Count; i++)
            {
                ResultProperty property2 = resultMap.Properties[i];
                property2.PropertyStrategy.Set(request, resultMap, property2, ref target, reader, null);
            }
            return(target);
        }
        public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader)
        {
            object[]   parameters = null;
            bool       flag       = false;
            IResultMap map        = mapping.NestedResultMap.ResolveSubMap(reader);

            if (map.Parameters.Count > 0)
            {
                parameters = new object[map.Parameters.Count];
                for (int i = 0; i < map.Parameters.Count; i++)
                {
                    ResultProperty property = map.Parameters[i];
                    parameters[i]          = property.ArgumentStrategy.GetValue(request, property, ref reader, null);
                    request.IsRowDataFound = request.IsRowDataFound || (parameters[i] != null);
                    flag = flag || (parameters[i] != null);
                }
            }
            object resultObject = null;

            if ((map.Parameters.Count > 0) && !flag)
            {
                return(null);
            }
            resultObject = map.CreateInstanceOfResult(parameters);
            if (!base.FillObjectWithReaderAndResultMap(request, reader, map, ref resultObject))
            {
                resultObject = null;
            }
            return(resultObject);
        }
Пример #4
0
        /// <summary>
        /// Processes the specified <see cref="IDataReader"/>.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="resultObject">The result object.</param>
        /// <returns>The result object</returns>
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object outObject = resultObject;
            //实现对当前CurrentResultMap类中的discrimitor子节点类的设置
            IResultMap resultMap = request.CurrentResultMap.ResolveSubMap(reader);

            //获取resultMap分组名对应的值
            string uniqueKey = GetUniqueKey(resultMap, reader);
            // Gets the [key, result object] already build
            //根据IResultMap获取对应的IDictionary
            IDictionary <string, object> buildObjects = request.GetUniqueKeys(resultMap);

            if (buildObjects != null && buildObjects.ContainsKey(uniqueKey))
            {
                // Unique key is already known, so get the existing result object and process additional results.
                outObject = buildObjects[uniqueKey];
                // process resulMapping attribute which point to a groupBy attribute
                //遍历resultMap.Properties属性中为GroupByStrategy的属性
                for (int index = 0; index < resultMap.Properties.Count; index++)
                {
                    ResultProperty resultProperty = resultMap.Properties[index];
                    if (resultProperty.PropertyStrategy is PropertStrategy.GroupByStrategy)
                    {
                        //.................??? 跳到PropertyStrategy中的GroupByStrategy类
                        resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null);
                    }
                }
                outObject = SKIP;
            }
            else if (uniqueKey == null || buildObjects == null || !buildObjects.ContainsKey(uniqueKey))
            {
                // Unique key is NOT known, so create a new result object and process additional results.

                // Fix IBATISNET-241
                if (outObject == null)
                {
                    // temp ?, we don't support constructor tag with groupBy attribute
                    outObject = resultMap.CreateInstanceOfResult(null);//创建返回类的对象
                }

                for (int index = 0; index < resultMap.Properties.Count; index++)
                {
                    ResultProperty resultProperty = resultMap.Properties[index];
                    //为当前的resultProperty属性设置其从数据库中读到的值到outObject类中
                    resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null);
                }

                if (buildObjects == null)
                {
                    buildObjects = new Dictionary <string, object>();
                    request.SetUniqueKeys(resultMap, buildObjects);
                }
                buildObjects[uniqueKey] = outObject;
            }

            return(outObject);
        }
Пример #5
0
        /// <summary>
        /// Processes the specified <see cref="IDataReader"/>.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="resultObject">The result object.</param>
        /// <returns>The result object</returns>
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object outObject = resultObject;

            IResultMap resultMap = request.CurrentResultMap.ResolveSubMap(reader);

            string uniqueKey = GetUniqueKey(resultMap, request, reader);
            // Gets the [key, result object] already build
            IDictionary buildObjects = request.GetUniqueKeys(resultMap);

            if (buildObjects != null && buildObjects.Contains(uniqueKey))
            {
                // Unique key is already known, so get the existing result object and process additional results.
                outObject = buildObjects[uniqueKey];
                // process resulMapping attribute wich point to a groupBy attribute
                for (int index = 0; index < resultMap.Properties.Count; index++)
                {
                    ResultProperty resultProperty = resultMap.Properties[index];
                    if (resultProperty.PropertyStrategy is PropertStrategy.GroupByStrategy)
                    {
                        resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null);
                    }
                }
                outObject = SKIP;
            }
            else if (uniqueKey == null || buildObjects == null || !buildObjects.Contains(uniqueKey))
            {
                // Unique key is NOT known, so create a new result object and process additional results.

                // Fix IBATISNET-241
                if (outObject == null)
                {
                    // temp ?, we don't support constructor tag with groupBy attribute
                    outObject = resultMap.CreateInstanceOfResult(null);
                }

                for (int index = 0; index < resultMap.Properties.Count; index++)
                {
                    ResultProperty resultProperty = resultMap.Properties[index];
                    resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null);
                }

                if (buildObjects == null)
                {
                    buildObjects = new Hashtable();
                    request.SetUniqueKeys(resultMap, buildObjects);
                }
                buildObjects[uniqueKey] = outObject;
            }

            return(outObject);
        }
Пример #6
0
        /// <summary>
        /// Processes the specified <see cref="IDataReader"/>.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="resultObject">The result object.</param>
        /// <returns></returns>
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object outObject = resultObject;

            IResultMap resultMap = request.CurrentResultMap.ResolveSubMap(reader);

            string circularKey = GetCircularKey(resultMap, reader);
            // Gets the [key, result object] already build
            IDictionary <string, object> buildObjects = request.GetCirularKeys(resultMap);

            if (buildObjects != null && buildObjects.ContainsKey(circularKey))
            {
                // circular key is already known, so get the existing result object
                outObject = buildObjects[circularKey];
            }
            else if (circularKey == null || buildObjects == null || !buildObjects.ContainsKey(circularKey))
            {
                // circular key is NOT known, so create a new result object.
                if (outObject == null)
                {
                    object[] parameters = null;
                    if (resultMap.Parameters.Count > 0)
                    {
                        parameters = new object[resultMap.Parameters.Count];
                        // Fill parameters array
                        for (int index = 0; index < resultMap.Parameters.Count; index++)
                        {
                            ResultProperty resultProperty = resultMap.Parameters[index];
                            parameters[index] = resultProperty.GetValue(request, ref reader, null);
                        }
                    }

                    outObject = resultMap.CreateInstanceOfResult(parameters);
                }

                // For each Property in the ResultMap, set the property in the object
                for (int index = 0; index < resultMap.Properties.Count; index++)
                {
                    ResultProperty resultProperty = resultMap.Properties[index];
                    resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null);
                }

                if (buildObjects == null)
                {
                    buildObjects = new Dictionary <string, object>();
                    request.SetCirularKeys(resultMap, buildObjects);
                }
                buildObjects[circularKey] = outObject;
            }

            return(outObject);
        }
Пример #7
0
        /// <summary>
        /// Gets the value of the specified <see cref="ResultProperty"/> that must be set on the target object.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="resultMap">The result map.</param>
        /// <param name="mapping">The mapping.</param>
        /// <param name="reader">The reader.</param>
        /// <param name="target">The target object</param>
        public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader)
        {
            object[] parameters       = null;
            bool     isParameterFound = false;

            IResultMap resultMapping = mapping.NestedResultMap.ResolveSubMap(reader);

            if (resultMapping.Parameters.Count > 0)
            {
                parameters = new object[resultMapping.Parameters.Count];
                // Fill parameters array
                //获取返回结果类构造函数所需要的参数的值
                for (int index = 0; index < resultMapping.Parameters.Count; index++)
                {
                    ResultProperty resultProperty = resultMapping.Parameters[index];
                    parameters[index]      = resultProperty.GetValue(request, ref reader, null);
                    request.IsRowDataFound = request.IsRowDataFound || (parameters[index] != null);
                    isParameterFound       = isParameterFound || (parameters[index] != null);
                }
            }

            object obj = null;

            // If I have a constructor tag and all argumments values are null, the obj is null
            if (resultMapping.Parameters.Count > 0 && isParameterFound == false)
            {
                obj = null;
            }
            else
            {
                //创建返回类对象 动态初始化 ResultMap类中实现
                obj = resultMapping.CreateInstanceOfResult(parameters);

                // Fills properties on the new object
                //实现对obj中每一个属性的赋值 BaseStrategy中实现
                if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false)
                {
                    obj = null;
                }
            }

            return(obj);
        }
        public object Process(RequestScope request, ref IDataReader reader, object resultObject)
        {
            object      target     = resultObject;
            IResultMap  resultMap  = request.CurrentResultMap.ResolveSubMap(reader);
            string      key        = base.GetUniqueKey(resultMap, request, reader);
            IDictionary uniqueKeys = request.GetUniqueKeys(resultMap);

            if ((uniqueKeys != null) && uniqueKeys.Contains(key))
            {
                target = uniqueKeys[key];
                for (int i = 0; i < resultMap.Properties.Count; i++)
                {
                    ResultProperty mapping = resultMap.Properties[i];
                    if (mapping.PropertyStrategy is IBatisNet.DataMapper.MappedStatements.PropertStrategy.GroupByStrategy)
                    {
                        mapping.PropertyStrategy.Set(request, resultMap, mapping, ref target, reader, null);
                    }
                }
                return(BaseStrategy.SKIP);
            }
            if (((key == null) || (uniqueKeys == null)) || !uniqueKeys.Contains(key))
            {
                if (target == null)
                {
                    target = resultMap.CreateInstanceOfResult(null);
                }
                for (int j = 0; j < resultMap.Properties.Count; j++)
                {
                    ResultProperty property2 = resultMap.Properties[j];
                    property2.PropertyStrategy.Set(request, resultMap, property2, ref target, reader, null);
                }
                if (uniqueKeys == null)
                {
                    uniqueKeys = new Hashtable();
                    request.SetUniqueKeys(resultMap, uniqueKeys);
                }
                uniqueKeys[key] = target;
            }
            return(target);
        }
Пример #9
0
        /// <summary>
        /// Gets the value of an argument constructor.
        /// </summary>
        /// <param name="request">The current <see cref="RequestScope"/>.</param>
        /// <param name="mapping">The <see cref="ResultProperty"/> with the argument infos.</param>
        /// <param name="reader">The current <see cref="IDataReader"/>.</param>
        /// <param name="keys">The keys</param>
        /// <returns>The paremeter value.</returns>
        public object GetValue(RequestScope request, ResultProperty mapping,
                               ref IDataReader reader, object keys)
        {
            object[] parameters       = null;
            bool     isParameterFound = false;

            IResultMap resultMapping = mapping.NestedResultMap.ResolveSubMap(reader);

            if (resultMapping.Parameters.Count > 0)
            {
                parameters = new object[resultMapping.Parameters.Count];
                // Fill parameters array
                for (int index = 0; index < resultMapping.Parameters.Count; index++)
                {
                    ResultProperty property = resultMapping.Parameters[index];
                    parameters[index]      = property.ArgumentStrategy.GetValue(request, property, ref reader, null);
                    request.IsRowDataFound = request.IsRowDataFound || (parameters[index] != null);
                    isParameterFound       = isParameterFound || (parameters[index] != null);
                }
            }

            object obj = null;

            // If I have a constructor tag and all argumments values are null, the obj is null
            if (resultMapping.Parameters.Count > 0 && isParameterFound == false)
            {
                obj = null;
            }
            else
            {
                obj = resultMapping.CreateInstanceOfResult(parameters);
                if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false)
                {
                    obj = null;
                }
            }

            return(obj);
        }