Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 /// <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);
 }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 /// <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>();
 }
Beispiel #5
0
        /// <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);
        }