private void GenerateSelectFromClause(StringBuilder text, FromClause from) { if(from == null) return; var mapping = MetadataManager.Default.GetMapping(from.Entity.QualifiedName) as MetadataMappingEntity; var tableName = mapping.StorageEntity.GetAttributeValue("name"); text.AppendFormat("FROM {0} AS {1}", tableName, from.Alias); text.AppendLine(); foreach(var join in from.Joins) { text.AppendFormat(@"\tLEFT JOIN {0} AS {1} ON", join.Entity, join.Alias); text.AppendLine(); for(int i = 0; i < join.DependentRefs.Count; i++) { text.AppendFormat("", join.Alias, join.DependentRefs[i].Name, join.Refs[i].Name); } } }
internal FromClause GetSelectFromClause(string qualifiedName, string scope) { if(string.IsNullOrWhiteSpace(qualifiedName)) throw new ArgumentNullException("qualifiedName"); var entity = MetadataManager.Default.GetConceptElement<MetadataEntity>(qualifiedName); if(entity == null) throw new DataException(string.Format("Not found the concept entity with '{0}'.", qualifiedName)); var index = 1; var inherits = DataUtility.GetInherits(entity); var from = new FromClause(inherits.Pop(), index++); while(inherits.Count > 0) { var current = inherits.Pop(); from.Joins.Add(new JoinClauseEx(index++, current, current.Key, from.Entity.Key)); } var members = DataUtility.ResolveScope(entity, scope); foreach(var member in members) { var parts = member.Split('.'); for(int i = 0; i < parts.Length; i++) { var property = entity.GetProperty(parts[i]) as MetadataEntityComplexProperty; if(property != null && (property.Relationship.IsOneToOne() || property.Relationship.IsManyToOne())) { var memberName = string.Join(".", parts, 0, i); var join = this.FindJoinClause(from.Joins, jc => jc.NavigationPropertyName == memberName); if(join == null) { join = new JoinClauseEx(index++, property.Relationship.GetToEntity(), property.Relationship.GetToEntityReferences().ToArray(), property.Relationship.GetFromEntityReferences().ToArray()) { NavigationPropertyName = memberName, }; if(from.Entity == property.Relationship.GetFromEntity()) { from.Joins.Add(join); } else { var parent = this.FindJoinClause(from.Joins, jc => jc.Entity == property.Relationship.GetFromEntity()); if(parent == null) parent.Children.Add(join); } } } } } return from; }