/// <summary> /// 构造左连接SQL /// </summary> /// <param name="sql">Select语句</param> /// <param name="association">关联</param> private void BuildLeftJoin(SelectSqlStatement sql, InternalAssociation association, SqlBuildingContext context) { LeftJoinItem leftJoin = new LeftJoinItem(); leftJoin.LeftJoinTable = association.LocatedTable; foreach (var item in association.Association.Items) { SqlTable srcElelemtTable = association.LocatedTable; var srcElement = association.LocatedNode.Elements.FirstOrDefault(i => i.ID == item.SourceElementID); var targetElement = association.AssociatedCoNode.Elements.FirstOrDefault(i => i.ID == item.TargetElementID); var leftCol = association.LocatedDataObject.Columns.FirstOrDefault(i => i.ID == srcElement.DataColumnID); var rightCol = association.AssociatedDataObject.Columns.FirstOrDefault(i => i.ID == targetElement.DataColumnID); JoinConditionItem joinItem = new JoinConditionItem(); joinItem.LeftField.Table = srcElelemtTable; joinItem.LeftField.FieldName = leftCol.ColumnName; joinItem.LeftField.IsUseFieldPrefix = true; joinItem.RightField.Table = association.AssociatedTable; joinItem.RightField.FieldName = rightCol.ColumnName; joinItem.RightField.IsUseFieldPrefix = true; leftJoin.ChildCollection.Add(joinItem); } //关联上的条件 leftJoin.AdditionalCondition = this.ParseCondition(association); sql.MainFromItem.ChildCollection.Add(leftJoin); }
/// <summary> /// 处理关联 /// </summary> /// <param name="sql">Select语句</param> /// <param name="context">SQL构造上下文</param> /// <param name="association">关联</param> private void HandlingAssociation(SelectSqlStatement sql, SqlBuildingContext context, Association association) { if (association.AssoDomainObject == null) { throw new Exception("Association cannot find Associate Model: " + association.ID); } if (association.AssoDomainObject == null) { throw new Exception("Association cannot find Associate ModelObject: " + association.ID); } if (association.AssoDomainObject.DataObject == null) { throw new Exception("Association cannot find Associate DataObject: " + association.ID); } //关联中使用的SqlTable,通过关联的ID进行标识,存在一个节点上的多个元素关联同一个表的情况 SqlTable associatedSqlTable = base.FindSqlTable(association.ID, sql.SqlBuildingInfo); if (associatedSqlTable == null) { var assoTableName = context.DataObjectTableMapping[association.AssoDomainObject.DataObject.ID]; associatedSqlTable = base.TryFindAndRegistSqlTable(association.AssoDomainObject.DataObject.ID, assoTableName, assoTableName, assoTableName, sql.SqlBuildingInfo); } var childAssociation = new InternalAssociation() { AssociatedCommonObject = association.AssoDomaiModel, AssociatedCoNode = association.AssoDomainObject, AssociatedDataObject = association.AssoDomainObject.DataObject, AssociatedTable = associatedSqlTable, LocatedCommonObject = sql.SqlBuildingInfo.CommonObject, LocatedDataObject = sql.SqlBuildingInfo.CurrentDataObject, LocatedNode = sql.SqlBuildingInfo.CurrentNode, LocatedTable = sql.SqlBuildingInfo.CurrentSqlTable, Association = association, AdditionalCondition = association.FilterCondition }; foreach (var refElement in association.RefElements) { var element = association.AssoDomainObject.Elements.FirstOrDefault(i => i.ID == refElement.ElementID); var assElement = new InternalRefElement() { Element = element, Label = element.Alias }; childAssociation.RefElements.Add(assElement); } BuildLeftJoin(sql, childAssociation, context); }
private string ParseCondition(InternalAssociation association) { return association.Association.FilterCondition; }