/// <summary> /// Set a attribute on a property /// </summary> /// <typeparam name="TProp"></typeparam> public void SetPropertyAttribute <TProp>(Expression <Func <T, TProp> > exp, DataAccessAttribute attribute) { var info = exp.GetPropertyInfoFromLamdba(); var fod = ClassInfoCache.Propertys.First(s => s.Key == info).Value; fod.Attributes.Add(new DbAttributeInfoCache(attribute)); }
/// <summary> /// set a Attribute on a method /// </summary> /// <typeparam name="TProp"></typeparam> public void SetMethodAttribute <TProp>(Expression <Func <T, TProp> > exp, DataAccessAttribute attribute) { var info = exp.GetMehtodInfoFromLabda(); var fod = ClassInfoCache.Mehtods.First(s => s.MethodName == info); fod.Attributes.Add(new DbAttributeInfoCache(attribute)); }
/// <summary> /// Conditional statement (in) additional configuration /// 条件文(in)追加設定 /// </summary> /// <param name="column"></param> /// <param name="values"></param> /// <param name="type"></param> /// <param name="isAnd"></param> /// <param name="equal"></param> public void AddInCondition(string column, string[] values, Type type, bool isAnd, bool equal = true) { if (values == null) { return; } this.AddOperator(isAnd); DataAccessAttribute attribute = this.GetDataAccessAttribute <DataAccessAttribute>(type); AddInConditionValue(column, attribute, values, equal); }
/// <summary> /// Additional configuration conditional statement /// 条件文追加設定 /// </summary> /// <param name="column"></param> /// <param name="value"></param> /// <param name="type"></param> /// <param name="isAnd"></param> /// <param name="equal"></param> public void AddCondition(string column, object value, Type type, bool isAnd, bool equal) { if (value == null) { return; } this.AddOperator(isAnd); DataAccessAttribute attribute = this.GetDataAccessAttribute <DataAccessAttribute>(type); AddConditionValue(column, attribute, value.ToString(), equal); }
/// <summary> /// Condition value setting /// 条件値設定 /// </summary> /// <param name="column"></param> /// <param name="attribute"></param> /// <param name="value"></param> /// <param name="equal"></param> private void AddConditionValue(string column, DataAccessAttribute attribute, string value, bool equal) { value = this.EscapeSingleQuotation(value.ToString()); if (equal) { WhereSql.AppendLine(string.Format("{0}.{1} = '{2}'", attribute.TableName, column, value.ToString())); } else { WhereSql.AppendLine(string.Format("{0}.{1} != '{2}'", attribute.TableName, column, value.ToString())); } }
/// <summary> /// Select SQL statement generation /// セレクトSQL文生成 /// </summary> private void CreateSelectSql() { this.ExecutetSql = new StringBuilder(); DataAccessAttribute attribute = this.GetDataAccessAttribute <DataAccessAttribute>(this.BaseType); ExecutetSql.AppendLine(string.Format(SELECT_SQL, this.CreateSelectColumn(), attribute.TableName)); ExecutetSql.AppendLine(this.JoinSql.ToString()); ExecutetSql.AppendLine(this.WhereSql.ToString()); if (!this.OrderByColumns.Length.Equals(0)) { ExecutetSql.AppendLine(string.Format(ORDER_BY_SQL, string.Join(",", this.OrderByColumns))); } Debug.Log(this.ExecutetSql.ToString()); }
/// <summary> /// Condition value (in) setting /// 条件値(in)設定 /// </summary> /// <param name="column"></param> /// <param name="attribute"></param> /// <param name="values"></param> /// <param name="equal"></param> private void AddInConditionValue(string column, DataAccessAttribute attribute, string[] values, bool equal) { for (int i = 0; i < values.Length; i++) { values[i] = EscapeSingleQuotation(values[i]); } if (equal) { WhereSql.AppendLine(string.Format("{0}.{1} in ({2})", attribute.TableName, column, string.Format("'{0}'", string.Join("','", values)))); } else { WhereSql.AppendLine(string.Format("{0}.{1} not in ({2})", attribute.TableName, column, string.Format("'{0}'", string.Join("','", values)))); } }
/// <summary> /// Add join table (And join only ) /// 結合テーブル追加 (And結合のみ) /// </summary> /// <param name="baseType"></param> /// <param name="joinColumns">The same name row ,同名列</param> /// <param name="isInner"></param> public void AddJoinTable(Type baseType, Type joinType, string[] joinColumns, bool isInner = true) { DataAccessAttribute attribite = this.GetDataAccessAttribute <DataAccessAttribute>(joinType); string tableName = this.GetDataAccessAttribute <DataAccessAttribute>(baseType).TableName; string joinTableType = (isInner) ? "inner" : "left"; StringBuilder joinConditions = new StringBuilder(); for (int i = 0; i < joinColumns.Length; i++) { if (i.Equals(0)) { joinConditions.Append(" and "); } joinConditions.Append(string.Format("{0}.{1} = {2}.{3}", tableName, joinColumns[i], attribite.TableName, joinColumns[i])); } JoinSql.AppendLine(string.Format("{0} join {1} on {2}", joinTableType, attribite.TableName, joinConditions.ToString())); this.AddSelectType(joinType); }
/// <summary> /// 扫描DataAccess特性的类,并创建实例。 /// </summary> /// <param name="dlls">指定的要被扫描的dll。</param> private void ScanDataAccessAttribute(string[] dlls) { foreach (string dll in dlls) { Assembly assembly = Assembly.LoadFile(dll); Type[] types = assembly.GetTypes(); foreach (Type clazz in types) { if (clazz.IsClass) { //1.扫描类的DataAccess特性 //获取属性 Attribute attributeDataAccessAttribute = clazz.GetCustomAttribute(typeof(DataAccessAttribute)); if (attributeDataAccessAttribute == null)//如果该类没有DataAccess特性 { continue; } DataAccessAttribute dataAccessAttribute = (DataAccessAttribute)attributeDataAccessAttribute; string dataAccessName = clazz.Name.Substring(0, 1).ToLower() + (clazz.Name.Length > 1 ? clazz.Name.Substring(1) : string.Empty); if (!string.IsNullOrWhiteSpace(dataAccessAttribute.Name))//如果设置了DataAccessAttribute的Name值 { dataAccessName = dataAccessAttribute.Name; } if (BeanContainer.ContainsKey(dataAccessName)) { throw new BeanCreationException(string.Format("不能创建‘{0}’,已经存在该实例。", dataAccessName)); } //添加实例到容器中 object clazzInstance = Activator.CreateInstance(clazz);//创建类的实例 BeanContainer.Add(dataAccessName, new BeanInfo() { Bean = clazzInstance, AtrributeType = AtrributeType.DataAccess }); } //end : if (clazz.IsClass) } //end : foreach (Type clazz in types) } //end : foreach (string dll in dlls) }
/// <summary> /// set a Attribute on a method /// </summary> public void SetMethodAttribute(string info, DataAccessAttribute attribute) { var fod = ClassInfoCache.Mehtods.First(s => s.MethodName == info); fod.Attributes.Add(new DbAttributeInfoCache(attribute)); }
/// <summary> /// Set a attribute on a property /// </summary> public void SetPropertyAttribute(string info, DataAccessAttribute attribute) { var fod = ClassInfoCache.Propertys.First(s => s.Key == info).Value; fod.Attributes.Add(new DbAttributeInfoCache(attribute)); }
/// <summary> /// set a Attribute on a class /// </summary> public void SetClassAttribute(DataAccessAttribute attribute) { ClassInfoCache.Attributes.Add(new DbAttributeInfoCache(attribute)); }