public string GetMappedPropertyName(string column) { string mappedPropertyName = GetPropertyName(column); if (string.IsNullOrEmpty(mappedPropertyName)) { string[] columnParts = column.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if (columnParts.Length > 1) { foreach (ReferenceMapInfo reference in GetReferencesMapList()) { ModelMap referenceModelMap = ModelMap.GetModelMap(reference.ReferencedModelType); if (referenceModelMap != null && (referenceModelMap.Table == columnParts[0] || columnParts[0] == reference.Property)) { mappedPropertyName = reference.Property; mappedPropertyName += "." + referenceModelMap.GetMappedPropertyName(column.Remove(0, (columnParts[0] + ".").Length)); break; } } } } return(mappedPropertyName); }
/// <summary> /// Retorna um objeto da entidade montada a partir de um DataReader e do seu mapeamento /// </summary> /// <param name="dr">DataReader</param> /// <param name="modelType">Tipo da entidade</param> /// <returns>Objeto da entidade</returns> public TModel GetModelObjectByDataReader <TModel>(IDataReader dr, Type modelType = null) where TModel : class, Layers.IModel { if (modelType == null) { modelType = typeof(TModel); } //TODO:Tratar exceções TModel result = default(TModel); ModelMaps.ModelMap modelMap = ModelMaps.ModelMap.GetModelMap(modelType); if (modelMap != null) { XmlDocument docXml = new XmlDocument(); docXml.AppendChild(docXml.CreateXmlDeclaration("1.0", null, null)); XmlElement root = docXml.CreateElement(modelType.GetTypeName()); docXml.AppendChild(root); bool isNullRow = true; for (int i = 0; i < dr.FieldCount; i++) { string propertyName = modelMap.GetMappedPropertyName(dr.GetName(i)); if (!string.IsNullOrEmpty(propertyName) && dr.GetValue(i) != DBNull.Value) { isNullRow = false; XmlNode nodeToAppend = root; string mappedNode = propertyName; foreach (string nodeName in mappedNode.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)) { if (nodeToAppend.SelectSingleNode(nodeName) != null) { nodeToAppend = nodeToAppend.SelectSingleNode(nodeName); } else { nodeToAppend.AppendChild(docXml.CreateElement(nodeName)); nodeToAppend = nodeToAppend.LastChild; } } string val = dr[i].ToString(); double num; if (double.TryParse(val.ToString(), out num) && dr[i].GetType() != typeof(string)) { val = num.ToString(System.Globalization.CultureInfo.InvariantCulture); } else if (dr[i].GetType() == typeof(DateTime)) { val = dr.GetDateTime(i).ToString("yyyy-MM-ddTHH:mm:ss"); } else if (dr[i].GetType() == typeof(bool)) { val = val.ToLower(); } else if (dr[i].GetType() == typeof(byte[])) { val = Commons.Utilities.ClassToXML.SerealizeBytes((dr[i] as Byte[])); } if (modelMap.GetMappedColumnMap(propertyName).DataType == DataAnnotations.ERBridge.DataType.Xml) { try { nodeToAppend.InnerXml = val; } catch { nodeToAppend.InnerText = val; } } else { nodeToAppend.InnerText = val; } } } if (!isNullRow) { result = (TModel)Commons.Utilities.ClassToXML.DeserializeXML(docXml.InnerXml, modelType); } result.IsReady = true; } return(result); }