C#递归应用之实现JS文件的自动引用

作者:hztech 时间:2023-12-09 00:03:52 

背景

两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张表中的字段 的名称(field)和描述信息(table) , 

截图如下:

sys_tbl

C#递归应用之实现JS文件的自动引用

C#递归应用之实现JS文件的自动引用

其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如:einventory_cinvcode,就是对表 e_inventory 中字段 cinvcode的引用。

每张表都在系统 中对应有不同功能的js文件(模块)如: 编辑窗体(dialog类型),跨域选择窗体(field)类型等

需求

在一个综合的页面中,会对其它对象进行引用(依赖),而这种引用最终体现在对js文件的包含。同时被引用的js 文件(一级引用)还有自已关联对象(二级引用).....如此下去,直到N 级引用。

所以现在需要逐层找到对象的引用,直到最后不依赖任何对象为止,并把这些js文件生成引用包含路径(不重复)

分析

1、返回结果类型

得到这些js引用,不能重复,但是对象之间引用是可以存在交叉的,在整个引用链条上,同一个对象会被 多个对象引用,所以简单的字符串数组是避免不了重复的。但是在C#中的HashSet可以做到不重复,同时这个去重工作是自动完成的,所以存结果如果是简单的value类型,用 HashSet就可以,但是因为字段中表的信息已经被格式化过,所以还要把格式化之前的表名称取出与字段对应,所以需要一个key-value类型的数据 ,那就是 Dictionary<string, string> 了。

2、算法选择

因为查找引用,是层层进行的,而且下一层引用的要用到上一层的引用结果,所以这里选择递归算法

代码实现

声明一个全局变量,记录所有的表与字段的对应的数据,因为需要确保数据key 唯一性所以选择Dicctionary类型

/// <summary>
       /// define the gloable parameter to save the rel obj data
       /// </summary>
       public static Dictionary<string, string> <strong>deepRef </strong>= new Dictionary<string, string>();

入口函数,完成准备工作,(数据库连接,参数准备)

/// <summary>
       /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
       /// </summary>
       /// <param name="headField">表字段列表</param>
       /// <returns></returns>
       public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)
       {
           HashSet<string> refset = new HashSet<string>();
          // HashSet<string> refset_result = new HashSet<string>();
           foreach (var item in headField)
           {
               if (!item.controlType.StartsWith("hz_"))// is not the field of  reference
               {
                   continue;
               }
               string[] fieldarr = item.dataIndex.Split('_');//the constructor is :[tabble]_[field]

refset.Add(fieldarr[0]);//the first prefix

}
           dataOperate dao = new dataOperate();
           dao.DBServer = "info";
           SqlConnection conn = dao.createCon();
           try
           {
               if (refset.Count > 0)
               {

if (conn.State != ConnectionState.Open)
                       conn.Open();//open connection
                   deepRef = new Dictionary<string, string>();//clear the relation obj data
                   getRef(conn, refset);

}
               return deepRef;
           }
           catch (Exception)
           {

throw;
           }
           finally
           {
               if (conn.State == ConnectionState.Open)
                   conn.Close();
           }

}

递归函数,最终完成在数据库中获取字段依赖的对象的获取

/// <summary>
       /// get the relation obj
       /// </summary>
       /// <param name="conn"></param>
       /// <param name="ref_field"></param>
       /// <returns></returns>
       public static HashSet<string> <strong>getRef</strong>(SqlConnection conn, HashSet<string> ref_field)
       {
           HashSet<string> refset = new HashSet<string>();

string refstr = string.Join("','", ref_field);
           if (refstr != "")
           {
               refstr = "'" + refstr + "'";

string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";
               //get dataset relation obj
               DataSet ds = dataOperate.getDataset(conn, sql);
               if (ds != null && ds.Tables.Count > 0)
               {
                   DataTable dt = ds.Tables[0];
                   if (dt.Rows.Count > 0)
                   {
                       //rel ref exists
                       for (int k = 0; k < dt.Rows.Count; k++)
                       {
                           string vt = dt.Rows[k].ItemArray[0].ToString();
                            string vv = dt.Rows[k].ItemArray[1].ToString();
                           refset.Add(vt);//save current ref
                           if(!<strong>deepRef</strong>.ContainsKey(vt))
                               <strong>deepRef</strong>.Add(vt, vv);// save all ref

}
                       if (refset.Count > 0)// get the ref successfully
                       {
                           //recursion get
                           getRef(conn, refset);
                       }

}

}

}
           else
           {
               //no ref
           }
           return refset;
       }

对函数进行调用,并组织出js文件引用路径

Dictionary<string,string> deepRef = ExtjsFun.getRelRef(HeadfieldSetup);
           if (deepRef != null)
           {
               foreach (var s in deepRef)
               {
                   string tem_module = "";
                   tem_module = s.Value;
                   string[] moduleArr = tem_module.Split('_');
                   if (tem_module.IndexOf("_") >= 0)
                       tem_module = moduleArr[1];//module name for instance: p_machine ,the module is “machine” unless not included the underscore
                   string fieldkind = "dialog";
                   jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");
                   fieldkind = "field";
                   jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");
               }
           }

最终结果 如下:

<script src="../../dept/demoApp/scripts/Sprice/SpriceE_spriceGridfield.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Org/OrgE_orgDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Unit/UnitE_unitDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Unit/UnitE_unitField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Wh/WhWh_whDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Wh/WhWh_whField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Mold/MoldP_moldDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Mold/MoldP_moldField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Bank/BankOa_bankDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Bank/BankOa_bankField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Machine/MachineP_machineDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Machine/MachineP_machineField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Inventory/InventoryE_inventoryDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeField.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Tax/TaxE_taxDialog.js" type="text/javascript"></script>
     <script src="../../dept/demoApp/scripts/Tax/TaxE_taxField.js" type="text/javascript"></script>

完事代码如下:

/// <summary>
       /// define the gloable parameter to save the rel obj data
       /// </summary>
       public static Dictionary<string, string> deepRef = new Dictionary<string, string>();
       /// <summary>
       /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
       /// </summary>
       /// <param name="headField">表字段列表</param>
       /// <returns></returns>
       public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)
       {
           HashSet<string> refset = new HashSet<string>();
          // HashSet<string> refset_result = new HashSet<string>();
           foreach (var item in headField)
           {
               if (!item.controlType.StartsWith("hz_"))// is not the field of  reference
               {
                   continue;
               }
               string[] fieldarr = item.dataIndex.Split('_');//the constructor is :[tabble]_[field]

refset.Add(fieldarr[0]);//the first prefix

}
           dataOperate dao = new dataOperate();
           dao.DBServer = "info";
           SqlConnection conn = dao.createCon();
           try
           {
               if (refset.Count > 0)
               {

if (conn.State != ConnectionState.Open)
                       conn.Open();//open connection
                   deepRef = new Dictionary<string, string>();//clear the relation obj data
                   getRef(conn, refset);

}
               return deepRef;
           }
           catch (Exception)
           {

throw;
           }
           finally
           {
               if (conn.State == ConnectionState.Open)
                   conn.Close();
           }

}

/// <summary>
       /// get the relation obj
       /// </summary>
       /// <param name="conn"></param>
       /// <param name="ref_field"></param>
       /// <returns></returns>
       public static HashSet<string> getRef(SqlConnection conn, HashSet<string> ref_field)
       {
           HashSet<string> refset = new HashSet<string>();

string refstr = string.Join("','", ref_field);
           if (refstr != "")
           {
               refstr = "'" + refstr + "'";

string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";
               //get dataset relation obj
               DataSet ds = dataOperate.getDataset(conn, sql);
               if (ds != null && ds.Tables.Count > 0)
               {
                   DataTable dt = ds.Tables[0];
                   if (dt.Rows.Count > 0)
                   {
                       //rel ref exists
                       for (int k = 0; k < dt.Rows.Count; k++)
                       {
                           string vt = dt.Rows[k].ItemArray[0].ToString();
                            string vv = dt.Rows[k].ItemArray[1].ToString();
                           refset.Add(vt);//save current ref
                           if(!deepRef.ContainsKey(vt))
                               deepRef.Add(vt, vv);// save all ref

}
                       if (refset.Count > 0)// get the ref successfully
                       {
                           //recursion get
                           getRef(conn, refset);
                       }

}

}

}
           else
           {
               //no ref
           }
           return refset;
       }

来源:https://www.cnblogs.com/hztech/p/17202728.html

标签:C#,递归,文件,引用
0
投稿

猜你喜欢

  • C#中使用资源的方法分析

    2022-01-16 16:27:02
  • C#通过NPOI操作Excel的实例代码

    2022-01-20 17:26:29
  • Eureka源码阅读之环境搭建及工程结构

    2023-07-26 01:02:36
  • JFinal实现伪静态的方法

    2023-07-17 12:11:37
  • eclipse 如何创建 user library 方法详解

    2021-12-29 00:33:56
  • 在C#项目中如何使用NHibernate详解

    2022-01-24 08:46:17
  • java图的深度优先遍历实现随机生成迷宫

    2023-06-26 06:06:05
  • java实现文件下载的两种方式

    2023-11-11 06:37:14
  • C#实现把txt文本数据快速读取到excel中

    2022-10-15 02:59:10
  • Mybatis 缓存原理及失效情况解析

    2022-12-04 07:28:43
  • Android Studio使用教程(一):下载与安装及创建HelloWorld项目

    2022-10-14 19:00:15
  • SpringBoot整合支付宝APP支付

    2021-10-12 02:57:24
  • Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    2023-01-31 14:08:39
  • 一文详解Spring的Enablexxx注解使用实例

    2023-09-03 08:43:18
  • C#用链式方法表达循环嵌套

    2023-04-14 06:54:23
  • java实现ftp文件上传下载功能

    2023-04-13 19:31:30
  • Android Init进程对信号的处理流程详细介绍

    2022-10-25 18:03:31
  • Java日常练习题,每天进步一点点(54)

    2023-08-18 21:55:17
  • Java装饰者模式的示例详解

    2022-03-30 07:26:22
  • Go Java算法之从英文中重建数字示例详解

    2023-10-25 02:37:26
  • asp之家 软件编程 m.aspxhome.com