private static ORMappingItemCollection GetMappingItemsBySubClass(RelativeAttributes attrs, MemberInfo sourceMI) { ORMappingItemCollection items = new ORMappingItemCollection(); System.Type subType = attrs.SubClassType != null ? attrs.SubClassType.Type : GetRealType(sourceMI); MemberInfo[] mis = GetTypeMembers(subType); foreach (SubClassORFieldMappingAttribute attr in attrs.SubClassFieldMappings) { MemberInfo mi = GetMemberInfoByName(attr.SubPropertyName, mis); if (mi != null) { if (items.ContainsKey(attr.DataFieldName) == false) { ORMappingItem item = new ORMappingItem(); item.PropertyName = sourceMI.Name; item.SubClassPropertyName = attr.SubPropertyName; item.MemberInfo = mi; item.DeclaringType = sourceMI.DeclaringType; if (attrs.SubClassType != null) { item.SubClassTypeDescription = attrs.SubClassType.TypeDescription; } FillMappingItemByAttr(item, attr); items.Add(item); } } } foreach (SubClassSqlBehaviorAttribute attr in attrs.SubClassFieldSqlBehaviors) { ORMappingItem item = FindItemBySubClassPropertyName(attr.SubPropertyName, items); if (item != null) { FillMappingItemByBehaviorAttr(item, attr); } } foreach (SubClassPropertyEncryptionAttribute attr in attrs.SubClassPropertyEncryptions) { ORMappingItem item = FindItemBySubClassPropertyName(attr.SubPropertyName, items); if (item != null) { FillMappingItemByEncryptionAttr(item, attr); } } return(items); }
private static void MergeMappingItems(ORMappingItemCollection dest, ORMappingItemCollection src) { foreach (ORMappingItem item in src) { if (dest.ContainsKey(item.DataFieldName) == false) { dest.Add(item); } } }
/// <summary> /// 根据对象拼Insert语句 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="graph">对象</param> /// <param name="mapping">映射关系</param> /// <param name="builder">生成Sql语句类型的Builder如TSqlBuilder或PlSqlBuilder</param> /// <param name="ignoreProperties">忽略的字段</param> /// <returns>根据传入的对象和对象映射时需要忽略的字段以及类定义上的表名,生成完整的Insert语句</returns> public static string GetInsertSql <T>(T graph, ORMappingItemCollection mapping, ISqlBuilder builder, params string[] ignoreProperties) { ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); ExceptionHelper.FalseThrow <ArgumentNullException>(builder != null, "builder"); InsertSqlClauseBuilder insertBuilder = GetInsertSqlClauseBuilder(graph, mapping, ignoreProperties); return(string.Format("INSERT INTO {0} {1}", mapping.TableName, insertBuilder.ToSqlString(builder))); }
/// <summary> /// 根据对象拼Where子句的方法 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="graph">对象</param> /// <param name="mapping">映射关系</param> /// <param name="ignoreProperties">忽略的字段</param> /// <returns>WhereSqlClauseBuilder,供拼Where子句使用</returns> /// <remarks> /// 根据传入的对象和对象映射时需要忽略的字段,返回WhereSqlClauseBuilder对象,以供后续拼Where子句使用 /// <code source="..\Framework\TestProjects\DeluxeWorks.Library.Data.SqlBuilder.Test\ORMappingTest.cs" region="GetWhereSqlClauseBuilder" lang="cs" title="根据传入的对象拼Where子句"/> /// <see cref="MCS.Library.Data.Builder.WhereSqlClauseBuilder"/> /// </remarks> public static WhereSqlClauseBuilder GetWhereSqlClauseBuilder <T>(T graph, ORMappingItemCollection mapping, params string[] ignoreProperties) { ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); WhereSqlClauseBuilder builder = new WhereSqlClauseBuilder(); FillSqlClauseBuilder(builder, graph, mapping, ClauseBindingFlags.Where, new DoSqlClauseBuilder <T>(DoWhereSqlClauseBuilder <T>), ignoreProperties); return(builder); }
/// <summary> /// 复制Mapping的集合 /// </summary> /// <returns></returns> public ORMappingItemCollection Clone() { ORMappingItemCollection items = new ORMappingItemCollection(); items.tableName = this.tableName; foreach (ORMappingItem item in this) { items.Add(item.Clone()); } return(items); }
/// <summary> /// 根据对象拼Update语句时的方法 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="graph">对象</param> /// <param name="mapping">映射关系</param> /// <param name="ignoreProperties">忽略的字段</param> /// <returns>UpdateSqlClauseBuilder对象,供拼Update语句使用</returns> /// <remarks> /// 根据传入的对象和对象映射时需要忽略的字段,返回UpdateSqlClauseBuilder对象,以供后续拼Update语句的字段名称和Values部分 /// <code source="..\Framework\TestProjects\DeluxeWorks.Library.Data.SqlBuilder.Test\ORMappingTest.cs" region="GetUpdateSqlClauseBuilder" lang="cs" title="拼Update语句"/> /// <see cref="MCS.Library.Data.Builder.UpdateSqlClauseBuilder"/> /// </remarks> public static UpdateSqlClauseBuilder GetUpdateSqlClauseBuilder <T>(T graph, ORMappingItemCollection mapping, params string[] ignoreProperties) { ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); UpdateSqlClauseBuilder builder = new UpdateSqlClauseBuilder(); FillSqlClauseBuilder(builder, graph, mapping, ClauseBindingFlags.Update, new DoSqlClauseBuilder <T>(DoInsertUpdateSqlClauseBuilder <T>), ignoreProperties); //builder.AppendTenantCode(typeof(T)); return(builder); }
/// <summary> /// 根据映射关系的中的对象类型来过滤 /// </summary> /// <param name="type"></param> /// <returns></returns> public ORMappingItemCollection FilterMappingInfoByDeclaringType(System.Type type) { ORMappingItemCollection result = new ORMappingItemCollection(); result.TableName = this.TableName; foreach (ORMappingItem item in this) { if (item.DeclaringType == type) { result.Add(item); } } return(result); }
/// <summary> /// 根据对象拼Insert语句 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="graph">对象</param> /// <param name="mapping">映射关系</param> /// <param name="builder">生成Sql语句类型的Builder如TSqlBuilder或PlSqlBuilder</param> /// <param name="ignoreProperties">忽略的字段</param> /// <returns>根据传入的对象和对象映射时需要忽略的字段以及类定义上的表名,生成完整的Insert语句</returns> public static string GetUpdateSql <T>(T graph, ORMappingItemCollection mapping, ISqlBuilder builder, params string[] ignoreProperties) { ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); ExceptionHelper.FalseThrow <ArgumentNullException>(builder != null, "builder"); using (ORMappingContext context = ORMappingContext.GetContext()) { UpdateSqlClauseBuilder updateBuilder = GetUpdateSqlClauseBuilder(graph, mapping, ignoreProperties); WhereSqlClauseBuilder whereBuilder = GetWhereSqlClauseBuilderByPrimaryKey(graph, mapping); return(string.Format("UPDATE {0} SET {1} WHERE {2}", mapping.TableName, updateBuilder.ToSqlString(builder), whereBuilder.ToSqlString(builder))); } }
private static ORMappingItemCollection CreateMappingItems(MemberInfo mi) { ORMappingItemCollection result = null; bool isDoMapping = false; RelativeAttributes attrs = null; Type realType = GetRealType(mi); //不处理除byte[]之外的集合类 if (mi.Name != "Item" && (realType == typeof(byte[]) || realType.GetInterface("ICollection") == null)) { attrs = GetRelativeAttributes(mi); if (attrs.NoMapping == null) { isDoMapping = true; } } if (isDoMapping == true) { if (attrs != null) { if (attrs.SubClassFieldMappings.Count > 0 || attrs.SubClassFieldSqlBehaviors.Count > 0) { result = GetMappingItemsBySubClass(attrs, mi); } else { result = GetMappingItems(attrs, mi); } } } else { result = new ORMappingItemCollection(); } return(result); }
/// <summary> /// 根据映射关系,得到Select语句中返回的字段名称数组 /// </summary> /// <param name="mapping"></param> /// <param name="ignoreProperties"></param> /// <returns></returns> public static string[] GetSelectFieldsName(ORMappingItemCollection mapping, params string[] ignoreProperties) { mapping.NullCheck("mapping"); ignoreProperties.NullCheck("ignoreProperties"); List <string> result = new List <string>(); foreach (ORMappingItem item in mapping) { if ((item.BindingFlags & ClauseBindingFlags.Select) != ClauseBindingFlags.None) { if (Array.Exists <string>(ignoreProperties, target => (string.Compare(target, item.PropertyName, true) == 0) ) == false) { result.Add(item.DataFieldName); } } } return(result.ToArray()); }
private static ORMappingItemCollection InnerGetMappingInfo(System.Type type) { ExceptionHelper.FalseThrow <ArgumentNullException>(type != null, "type"); ORMappingItemCollection result = null; if (ORMappingContextCache.Instance.TryGetValue(type, out result) == false) { result = ORMappingsCache.Instance.GetOrAddNewValue(type, (cache, key) => { ORMappingItemCollection mapping = GetMappingItemCollection(type); mapping.IsReadOnly = true; cache.Add(key, mapping); return(mapping); }); } return(result); }
/// <summary> /// 根据映射关系,得到Select语句中返回的字段名称的SQL语句部分 /// </summary> /// <param name="mapping"></param> /// <param name="ignoreProperties"></param> /// <returns></returns> public static string GetSelectFieldsNameSql(ORMappingItemCollection mapping, params string[] ignoreProperties) { string[] fields = GetSelectFieldsName(mapping, ignoreProperties); return(string.Join(", ", fields)); }
/// <summary> /// 将DataReader的值写入到对象中 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="dr">IDataReader对象</param> /// <param name="items">映射关系</param> /// <param name="graph">对象</param> public static void DataReaderToObject <T>(IDataReader dr, ORMappingItemCollection items, T graph) { DataReaderToObject(dr, items, graph, null); }
/// <summary> /// 将DataRow的值写入到对象中 /// </summary> /// <param name="row">DataRow对象</param> /// <param name="items">映射关系</param> /// <param name="graph">对象</param> public static void DataRowToObject(DataRow row, ORMappingItemCollection items, object graph) { DataRowToObject(row, items, graph, null); }
/// <summary> /// DataView的数据转换到集合中 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="items"></param> /// <param name="view"></param> public static void DataViewToCollection <T>(EditableDataObjectCollectionBase <T> collection, ORMappingItemCollection items, DataView view) where T : new() { DataViewToCollection(collection, items, view, null); }
/// <summary> /// DataView的数据转换到集合中 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="items"></param> /// <param name="view"></param> /// <param name="dod"></param> public static void DataViewToCollection <T>(EditableDataObjectCollectionBase <T> collection, ORMappingItemCollection items, DataView view, DataToObjectDeligations dod) where T : new() { collection.NullCheck("collection"); items.NullCheck("items"); view.NullCheck("view"); using (ORMappingContext context = ORMappingContext.GetContext()) { foreach (DataRowView drv in view) { T graph = new T(); DataRowToObject(drv.Row, items, graph, dod); collection.Add(graph); } } }
/// <summary> /// 将DataRow的值写入到对象中 /// </summary> /// <param name="row">DataRow对象</param> /// <param name="items">映射关系</param> /// <param name="graph">对象</param> /// <returns>所填充的graph</returns> public static object DataRowToObject(DataRow row, ORMappingItemCollection items, object graph) { return(DataRowToObject(row, items, graph, null)); }
/// <summary> /// 根据对象生成SELECT相关的字段。其builder会生成Field1, Field2 AS Name... /// </summary> /// <typeparam name="T"></typeparam> /// <param name="graph"></param> /// <param name="mapping"></param> /// <param name="ignoreProperties"></param> /// <returns></returns> public static string GetSelectSql <T>(T graph, ORMappingItemCollection mapping, params string[] ignoreProperties) { SelectSqlClauseBuilder builder = GetSelectSqlClauseBuilder <T>(graph, mapping, ignoreProperties); return(builder.ToSqlString(TSqlBuilder.Instance)); }
/// <summary> /// 根据对象拼Update语句 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="graph">对象</param> /// <param name="builder">生成Sql语句类型的Builder如TSqlBuilder或PlSqlBuilder</param> /// <param name="ignoreProperties">忽略的字段</param> /// <returns>根据传入的对象和对象映射时需要忽略的字段以及类定义上的表名,生成完整的Update语句</returns> public static string GetUpdateSql <T>(T graph, ISqlBuilder builder, params string[] ignoreProperties) { ORMappingItemCollection mapping = InnerGetMappingInfoByObject(graph); return(GetUpdateSql <T>(graph, mapping, builder, ignoreProperties)); }
/// <summary> /// 将DataReader的值写入到对象中 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="dr">IDataReader对象</param> /// <param name="items">映射关系</param> /// <param name="graph">对象</param> /// <returns>返回graph对象</returns> public static T DataReaderToObject <T>(IDataReader dr, ORMappingItemCollection items, T graph) { return(DataReaderToObject(dr, items, graph, null)); }
private static ORMappingItem FindItemBySubClassPropertyName(string subPropertyName, ORMappingItemCollection items) { ORMappingItem result = null; foreach (ORMappingItem item in items) { if (item.SubClassPropertyName == subPropertyName) { result = item; break; } } return(result); }
/// <summary> /// DataReader到Collection /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="dr"></param> /// <param name="items"></param> public static void DataReaderToCollection <T>(EditableDataObjectCollectionBase <T> collection, IDataReader dr, ORMappingItemCollection items) where T : new() { DataReaderToCollection <T>(collection, dr, items, null); }
/// <summary> /// DataReader到Collection /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="dr"></param> /// <param name="items"></param> /// <param name="dod"></param> public static void DataReaderToCollection <T>(EditableDataObjectCollectionBase <T> collection, IDataReader dr, ORMappingItemCollection items, DataToObjectDeligations dod) where T : new() { dr.NullCheck("dr"); items.NullCheck("items"); dod.NullCheck("dod"); using (ORMappingContext context = ORMappingContext.GetContext()) { while (dr.Read()) { T graph = new T(); DataReaderToObject(dr, items, graph, dod); collection.Add(graph); } } }
/// <summary> /// 读取字段的主键的键值对 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="graph"></param> /// <param name="mapping"></param> /// <param name="ignoreProperties"></param> /// <returns></returns> public static Dictionary <string, object> GetPrimaryKeyValuePairs <T>(T graph, ORMappingItemCollection mapping, params string[] ignoreProperties) { Dictionary <string, object> result = new Dictionary <string, object>(); ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); using (ORMappingContext context = ORMappingContext.GetContext()) { foreach (ORMappingItem item in mapping) { if (Array.Exists <string>(ignoreProperties, target => (string.Compare(target, item.PropertyName, true) == 0) ) == false) { if (item.PrimaryKey) { result[item.PropertyName] = GetValueFromObject(item, graph); } } } } return(result); }
/// <summary> /// 生成Field1 不等于 ... OR Field 2 不等于 ...的子句,用于判断某个对象是否与数据库中的值不一样 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="graph"></param> /// <param name="mapping"></param> /// <param name="includePK">是否包含主键,默认是包含的</param> /// <param name="ignoreProperties"></param> /// <returns></returns> public static WhereSqlClauseBuilder GetWhereSqlClauseBuilderByChangedFields <T>(T graph, ORMappingItemCollection mapping, bool includePK = true, params string[] ignoreProperties) { ExceptionHelper.FalseThrow <ArgumentNullException>(graph != null, "graph"); ExceptionHelper.FalseThrow <ArgumentNullException>(mapping != null, "mapping"); WhereSqlClauseBuilder builder = new WhereSqlClauseBuilder(LogicOperatorDefine.Or); if (includePK) { FillSqlClauseBuilder(builder, graph, mapping, ClauseBindingFlags.Where, new DoSqlClauseBuilder <WhereSqlClauseBuilder, T>(DoWhereSqlClauseBuilderByChangedFields <WhereSqlClauseBuilder, T>), ignoreProperties); } else { FillSqlClauseBuilder(builder, graph, mapping, ClauseBindingFlags.Where, new DoSqlClauseBuilder <WhereSqlClauseBuilder, T>(DoWhereSqlClauseBuilderByChangedFieldsWithoutPrimaryKey <WhereSqlClauseBuilder, T>), ignoreProperties); } return(builder); }
/// <summary> /// DataReader到Collection /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="dr"></param> /// <param name="items"></param> /// <param name="dod"></param> /// <returns>返回原有的集合</returns> public static EditableDataObjectCollectionBase <T> DataReaderToCollection <T>(EditableDataObjectCollectionBase <T> collection, IDataReader dr, ORMappingItemCollection items, DataToObjectDeligations dod) where T : new() { dr.NullCheck("dr"); items.NullCheck("items"); dod.NullCheck("dod"); using (ORMappingContext context = ORMappingContext.GetContext()) { while (dr.Read()) { collection.Add(DataReaderToObject(dr, items, new T(), dod)); } } return(collection); }