/// <summary> /// 将SqlNode的属性写入XmlElement。 /// </summary> /// <param name="sqlElement">SqlNode类的对象(或继承自SqlNode类的对象)</param> /// <param name="xmlParent">XmlDocument中的元素</param> public override void ToXml(SqlElement sqlElement, XmlElement xmlParent) { base.ToXml(sqlElement, xmlParent); FromItem fromItem = sqlElement as FromItem; XmlElement xmlTable = SerializerUtil.AddElement(xmlParent, SqlTable.TABLE); fromItem.Table.ToXml(fromItem.Table, xmlTable); }
/// <summary> /// 构造函数 /// </summary> public SelectSqlForSubQuery() : base() { From = new From(); MainFromItem = new FromItem(); Condition = new FilterConditionStatement(); JoinCondition = new JoinConditionStatement(); joinSubQueryConditionItem = new JoinConditionItem(); //JoinCondition.ChildCollection.Add(this.joinSubQueryConditionItem); }
/// <summary> /// 用XmlElement的信息构造SqlNode类的对象(或继承自SqlNode类的对象)。 /// </summary> /// <param name="sqlElement">SqlNode类的对象(或继承自SqlNode类的对象)</param> /// <param name="xmlParent">XmlDocument中的元素</param> /// <param name="xnm">集合命名空间范围管理类的对象</param> public override void FromXml(SqlElement sqlElement, XmlElement xmlParent, XmlNamespaceManager xnm) { base.FromXml(sqlElement, xmlParent, xnm); FromItem fromItem = sqlElement as FromItem; ParserUtil util = new ParserUtil(xnm); XmlElement xmlTable = util.Child(xmlParent, SqlTable.TABLE); fromItem.Table.FromXml(fromItem.Table, xmlTable, xnm); }
/// <summary> /// 构造函数 /// </summary> public SubQuerySqlStatement() : base() { From = new From(); mainFromItem = new FromItem(); From.ChildCollection.Add(mainFromItem); SelectList = new SelectFieldListStatement(); JoinCondition = new JoinConditionStatement(); FilterCondition = new ConditionStatement(); OrderByCondition = new ConditionStatement(); DictFieldAliasMapping = new Dictionary <string, string>(); }
/// <summary> /// 根据SQLDOM元素类型初始化SQLDOM元素对象 /// </summary> /// <param name="sqlElementType">SQLDOM元素类型</param> /// <returns>SQLDOM元素对象</returns> public static SqlElement GetSQLElement(int sqlElementType) { SqlElement element = null; SqlElementType type = (SqlElementType)sqlElementType; switch (type) { case SqlElementType.InsertField: element = new InsertField(); break; case SqlElementType.SqlPrimaryKeyField: element = new SqlPrimaryKeyField(); break; case SqlElementType.SelectListField: element = new SelectListField(); break; case SqlElementType.UpdateField: element = new UpdateField(); break; case SqlElementType.From: element = new From(); break; case SqlElementType.FromItem: element = new FromItem(); break; case SqlElementType.JoinCondition: element = new JoinConditionStatement(); break; case SqlElementType.OrderByCondition: element = new ConditionStatement(); break; case SqlElementType.FilterCondition: element = new ConditionStatement(); break; case SqlElementType.UnKnown: break; } return(element); }
/// <summary> /// 构造跟主表的关联。 /// </summary> /// <param name="currentObject">当前的数据模型对象。</param> /// <param name="sqlBuildInfo">SQL构造的中间变量。</param> /// <param name="querySql">删除过滤子查询SQL。</param> /// <remarks> /// 当前对象若是从对象,则需要建立跟主对象的关联, /// 然后根据主对象的唯一标识,形成删除的Sql。 /// </remarks> private void BuildParentInnerJoin(DomainObject currentObject, SqlBuildingInfo sqlBuildInfo, SelectSqlForSubQuery querySql, SqlBuildingContext context) { //如果是根节点,退出 if (currentObject.IsRootObject || currentObject.ID == sqlBuildInfo.CommonObject.RootDomainObjectID) { return; } #region 子节点(当前节点) var currentDataObject = currentObject.DataObject; var tableName = context.GetTableName(currentDataObject.ID); SqlTable currentTable = base.FindSqlTable(tableName, sqlBuildInfo); if (currentTable == null) { currentTable = new SqlTable(tableName, tableName, tableName); base.RegistSqlTable(tableName, currentTable, sqlBuildInfo); } #endregion #region 父节点 var parentObjecct = currentObject.ParentObject; var parentDataObject = parentObjecct.DataObject; var parentTableName = context.GetTableName(parentDataObject.ID); SqlTable parentTable = base.FindSqlTable(parentTableName, sqlBuildInfo); if (parentTable == null) { parentTable = new SqlTable(parentTableName, parentTableName, parentTableName); base.RegistSqlTable(parentTableName, parentTable, sqlBuildInfo); } FromItem parentFromItem = new FromItem(parentTable); querySql.From.ChildCollection.Add(parentFromItem); #endregion #region 关联关系 //目前只是支持单个主对象结构,因此应该只有一个主从关联 var association = currentObject.Associations.FirstOrDefault(i => i.AssociateType == AssociateType.InnerJoin); foreach (var item in association.Items) { //主从关联中,源节点在子节点中,目标节点在父节点上 var sourceElement = currentObject.Elements.FirstOrDefault(i => i.ID == item.SourceElementID); var targetElement = parentObjecct.Elements.FirstOrDefault(i => i.ID == item.TargetElementID); var childCol = currentDataObject.Columns.FirstOrDefault(i => i.ID == sourceElement.ID); var parentCol = parentDataObject.Columns.FirstOrDefault(i => i.ID == targetElement.ID); JoinConditionItem joinItem = new JoinConditionItem(); joinItem.LeftField = new ConditionField(); joinItem.RightField = new ConditionField(); joinItem.LeftField.Table = currentTable; joinItem.LeftField.FieldName = childCol.ColumnName; joinItem.LeftField.IsUseFieldPrefix = true; joinItem.RightField.Table = parentTable; joinItem.RightField.FieldName = parentCol.ColumnName; joinItem.RightField.IsUseFieldPrefix = true; querySql.JoinCondition.ChildCollection.Add(joinItem); } #endregion BuildParentInnerJoin(parentObjecct, sqlBuildInfo, querySql, context); }