protected void SetGroupColumnValue(IGroupColumn column, MemberInfo memberInfo, GroupColumnAttribute groupColumnAttribute) { #region 不可覆盖的成员 if (memberInfo is FieldInfo) { column.PropertyType = ((FieldInfo)memberInfo).FieldType; } else { column.PropertyType = ((PropertyInfo)memberInfo).PropertyType; } column.GroupFunction = groupColumnAttribute.GroupFunction; column.OriginalPropertyName = column.GroupFunction == GroupFunction.Count ? "***" : groupColumnAttribute.OriginalPropertyName; column.PropertyName = memberInfo.Name; #endregion }
protected void SetTableValue(T table, Type entityType, TableAttribute tableAttribute, TableAttributeBase tableAttributeBase) { table.TableName = string.IsNullOrWhiteSpace(tableAttribute.TableName) ? entityType.Name : tableAttribute.TableName; table.Columns = new Dictionary<string, IColumn>(StringComparer.OrdinalIgnoreCase);//不区分大小写 table.Relations = new Dictionary<string, IRelation>(StringComparer.OrdinalIgnoreCase);//不区分大小写 PropertyInfo[] propertyInfos = entityType.GetProperties(); foreach (PropertyInfo propertyInfo in propertyInfos) { IColumn column = ReadColumnAttribute(propertyInfo); if (column == null) { IRelation relation = ReadRelationAttribute(propertyInfo); if (relation == null) { IGroupColumn groupColumn = ReadGroupColumnAttribute(propertyInfo); if (groupColumn != null) { //table.AddGroupColumn(groupColumn); //table.GroupColumns.Add(new PropertyExpression(propertyInfo.Name, groupColumn.GroupFunction), groupColumn); table.GroupColumns.Add(new PropertyExpression(groupColumn.OriginalPropertyName, groupColumn.GroupFunction), groupColumn); } } else { table.Relations.Add(propertyInfo.Name, relation); } } else { table.Columns.Add(propertyInfo.Name, column); } } FieldInfo[] fieldInfos = entityType.GetFields(); foreach (FieldInfo fieldInfo in fieldInfos) { IColumn column = ReadColumnAttribute(fieldInfo); if (column == null) { IRelation relation = ReadRelationAttribute(fieldInfo); if (relation == null) { IGroupColumn groupColumn = ReadGroupColumnAttribute(fieldInfo); if (groupColumn != null) { //table.AddGroupColumn(groupColumn); table.GroupColumns.Add(new PropertyExpression(fieldInfo.Name, groupColumn.GroupFunction), groupColumn); } } else { table.Relations.Add(fieldInfo.Name, relation); } } else { table.Columns.Add(fieldInfo.Name, column); } } #region 覆盖 if (tableAttributeBase != null) { if (!string.IsNullOrWhiteSpace(tableAttributeBase.TableName)) { table.TableName = tableAttributeBase.TableName;//覆盖 } } #endregion }
private static void AnalyseInner(IMappingProvider mappingProvider, object entityType, SqlAnalyseResult sqlAnalyseResult, ObjectFiller objectFiller, IDictionary <IPropertyExpression, string> taskPropertyNames, string prefix, ref int tableIndexCounter, ref int outputColumnIndexCounter ) { ITable table = mappingProvider.GetTable(entityType); string currentTableNameAlias = "t" + tableIndexCounter; if (prefix == null) { //前缀为null时表示是起始对象 sqlAnalyseResult.MasterEntityType = entityType; sqlAnalyseResult.MasterTableNameAlias = currentTableNameAlias; } Dictionary <string, Dictionary <IPropertyExpression, string> > taskObjects = new Dictionary <string, Dictionary <IPropertyExpression, string> >(StringComparer.OrdinalIgnoreCase); objectFiller.PropertyFillers = new List <PropertyFiller>(); foreach (IPropertyExpression propertyName in taskPropertyNames.Keys) { PrefixParser prefixParser = new PrefixParser(propertyName.PropertyName); if (prefixParser.HasPrefix) { //说明是外键对象的属性,例如"Person.City.CityId" if (!taskObjects.ContainsKey(prefixParser.Prefix)) { taskObjects.Add(prefixParser.Prefix, new Dictionary <IPropertyExpression, string>()); } taskObjects[prefixParser.Prefix].Add(new PropertyExpression(prefixParser.PropertyName, propertyName.GroupFunction), taskPropertyNames[propertyName]); } else { //说明是本对象的属性 string joinedPropertyName = PrefixParser.JoinPrefix(prefix, propertyName.PropertyName); IColumn column = null; if (joinedPropertyName == "***") { //伪造一个column //column = sqlProvider.CreateCountColumn(); } else { //如果不为***则column不会为null if (!table.Columns.ContainsKey(propertyName.PropertyName)) { throw new MissingMemberException(entityType.ToString(), propertyName.PropertyName); } column = table.Columns[propertyName.PropertyName]; } if (!sqlAnalyseResult.HasGroup && propertyName.GroupFunction != GroupFunction.None) { sqlAnalyseResult.HasGroup = true; } //sqlColumn SqlColumn sqlColumn = new SqlColumn(); sqlColumn.FullPropertyName = new PropertyExpression(joinedPropertyName, propertyName.GroupFunction); sqlColumn.Column = column; //oracle等数据库需要别名 StringBuilder sb = new StringBuilder(); if (propertyName.GroupFunction != GroupFunction.None) { sb.Append(propertyName.GroupFunction.ToString()); sb.Append("("); } if (propertyName.GroupFunction == GroupFunction.Count) { sb.Append("*"); } else { sb.Append(currentTableNameAlias); sb.Append("."); sb.Append(column.ColumnName); } if (propertyName.GroupFunction != GroupFunction.None) { sb.Append(")"); } sqlColumn.TableAliasAndColumn = sb.ToString(); //filler if (taskPropertyNames[propertyName] != null) { //只有输出字段才有PropertyFiller PropertyFiller propertyFiller = new PropertyFiller(); if (propertyName.GroupFunction == GroupFunction.None) { propertyFiller.PropertyName = column.PropertyName; propertyFiller.PropertyType = column.PropertyType; } else { if (!table.GroupColumns.ContainsKey(propertyName)) { throw new MissingMemberException(string.Format("类型{0}缺少标记为GroupFunction.{1}的GroupColumnAttribute", entityType, propertyName.GroupFunction)); } IGroupColumn groupColumn = table.GroupColumns[propertyName]; propertyFiller.PropertyName = groupColumn.PropertyName; propertyFiller.PropertyType = groupColumn.PropertyType; } propertyFiller.ColumnIndex = outputColumnIndexCounter; string outputSqlColumn = taskPropertyNames[propertyName]; if (outputSqlColumn == "") { //如果为空格,则使用默认f开头的计数器作为别名 sb.Append(" f"); sb.Append(outputColumnIndexCounter); outputColumnIndexCounter++; outputSqlColumn = sb.ToString(); } sqlAnalyseResult.SortedOutputColumns.Add(outputSqlColumn); objectFiller.PropertyFillers.Add(propertyFiller); } sqlAnalyseResult.SqlColumns.Add(sqlColumn.FullPropertyName, sqlColumn); } } //分析父对象,必须在自己属性分析完后才进行 objectFiller.ObjectFillers = new List <ObjectFiller>(); foreach (string objectPeropertyName in taskObjects.Keys) { string tableNameAlias = "t" + ++tableIndexCounter; if (!table.Relations.ContainsKey(objectPeropertyName)) { throw new MissingMemberException(entityType.ToString(), objectPeropertyName); } IRelation relation = table.Relations[objectPeropertyName]; SqlTable sqlTable = new SqlTable(); sqlTable.TableNameAlias = currentTableNameAlias; sqlTable.ForeignTableNameAlias = tableNameAlias; sqlTable.ForeignEntityType = relation.ForeignEntityType; List <SqlRelationColumn> sqlRelationColumns = new List <SqlRelationColumn>(); foreach (IRelationColumn relationColumn in relation.RelationColumns) { SqlRelationColumn sqlRelationColumn = new SqlRelationColumn(); sqlRelationColumn.ColumnName = relationColumn.ColumnName; sqlRelationColumn.ForeignColumnName = relationColumn.ForeignColumnName; StringBuilder sb = new StringBuilder(); sb.Append(sqlTable.TableNameAlias); sb.Append('.'); sb.Append(relationColumn.ColumnName); sb.Append('='); sb.Append(sqlTable.ForeignTableNameAlias); sb.Append('.'); sb.Append(relationColumn.ForeignColumnName); sqlRelationColumn.Expression = sb.ToString(); sqlRelationColumns.Add(sqlRelationColumn); } sqlTable.RelationColumns = sqlRelationColumns; sqlAnalyseResult.ForeignTables.Add(sqlTable); ObjectFiller subObjectFiller = new ObjectFiller(); subObjectFiller.PropertyName = relation.PropertyName; subObjectFiller.EntityType = relation.ForeignEntityType; objectFiller.ObjectFillers.Add(subObjectFiller); //AnalyseInner(sqlProvider, relation.PropertyAdapter.PropertyType, sqlAnalyseResult, subObjectFiller,taskObjects[objectPeropertyName], objectPeropertyName, tableIndexCounter, outputColumnIndexCounter); string joinedPropertyName = PrefixParser.JoinPrefix(prefix, relation.PropertyName); AnalyseInner(mappingProvider, relation.ForeignEntityType, sqlAnalyseResult, subObjectFiller, taskObjects[relation.PropertyName], joinedPropertyName, ref tableIndexCounter, ref outputColumnIndexCounter); } }