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