zoukankan      html  css  js  c++  java
  • 5.4更新 Dapper通用类新增方法:Oracle多表联查 获取集合 动态类型集合对象

    之前的微笑天使类:SmileAngel.cs  由于要使用Oracle 所以改装成支持oracle的了 并且为了方便多表之间查询,懒得去搞视图、存储过程,就写了一个通用的方法 可以支持多表查询,此方法灵活,可扩展。   

    /// <summary>
            ///  获取数据库集合 多表
            /// </summary>
            /// <param name="table_Names">多表 表名 按顺序逗号分隔</param>
            /// <param name="ziduans">要查询的字段集合 根据表名先后按顺序</param>
            /// <param name="where">查询条件</param>
      /// <param name="parms">关联关系 第一个是需要关联的表 逗号分割 第二个是需要关联的字段a或a1|a2</param> 
            /// <returns></returns>
            public static List<dynamic> GetListMoreModel(string table_Names, List<string> ziduans, string where, List<dynamic> parms, string orderby)
            {
                int f = 1;
                StringBuilder strSql = CtSqlHe(table_Names, ziduans, where, parms, orderby, ref f);
                Dapper.CommandDefinition dc = new Dapper.CommandDefinition(strSql.ToString());//组织sql命令
                return Dapper.SqlMapper.Query<object>(SmileBank.dbc, dc).ToList();//执行
            }




     private static StringBuilder CtSqlHe(string table_Names, List<string> ziduans, string where, List<dynamic> parms, string orderby, ref int count)
            {
                string tableNames = "";
                string gl_where = "";
                List<string> list_ob = table_Names.Split(',').ToList();
                foreach (var item in list_ob)
                {
                    tableNames += DName + item + ",";
                }
               foreach (object col in parms)
                {
                    if (gl_where != "")
                    {
                        gl_where += " and ";
                    }
                    string _tables = col.GetType().GetProperties()[0].GetValue(col, null).ToString();
                    string[] tables = _tables.Split(',');
                    string colName = col.GetType().GetProperties()[1].GetValue(col, null).ToString();
                    for (int i = 0; i < tables.Length; i++)
                    {
                        string tempcolName = colName;
                        if (colName.Contains('|'))//
                        {
                            tempcolName = colName.Split('|')[i];
                        }
                        gl_where += DName + tables[i] + "." + tempcolName + "=";
                    }
                    if (gl_where.Length > 0)
                    {
                        gl_where = gl_where.Substring(0, gl_where.Length - 1);
                    }
                }
                if (tableNames.Length > 0)
                {
                    tableNames = tableNames.Substring(0, tableNames.Length - 1);
                }
                StringBuilder strSql = new StringBuilder();
                string ziduan = "";
                for (int i = 0; i < ziduans.Count; i++)
                {
                    string[] col_name = ziduans[i].Split(',');
                    foreach (var item in col_name)
                    {
                        ziduan += DName + list_ob[i] + "." + item + ",";
                    }
     
                }
                if (ziduan.Length > 0)
                {
                    ziduan = ziduan.Substring(0, ziduan.Length - 1);
     
                }
                strSql.Append("select " + ziduan + " ");
                strSql.Append(" FROM " + tableNames + " ");
     
     
                //获取条数用的sql语句
                string sql_c = "select count(1) from " + tableNames;
     
                if (gl_where != "")
                {
                    strSql.Append(" where " + gl_where);
                    sql_c += " where " + gl_where;
                    if (where.Trim() != "")
                    {
                        strSql.Append(" and " + where);
                        sql_c += " and " + where;
                    }
                }
                else if (where.Trim() != "")
                {
                    strSql.Append(" where " + where);
                    sql_c += " where " + where;
                }
     
     
                if (orderby != "")
                {
                    //if (gl_where == "" && where.Trim() == "")
                    //{
                    //    strSql.Append(" where 1=1 order by " + orderby);
                    //}
                    strSql.Append(" order by " + orderby);
                }
     
                if (count == 0)
                {
                    //获取条数
                    Dapper.CommandDefinition dc = new Dapper.CommandDefinition(sql_c.ToString());//组织sql命令
                    object obj = Dapper.SqlMapper.ExecuteScalar(SmileBank.dbc, dc);//执行
     
                    if (obj == null)
                    {
                        count = 0;
                    }
                    else
                    {
                        count = Convert.ToInt32(obj);
                    }
                }
     
                return strSql;
     
            }

    ----------------------------
     由于返回的结果是动态类型集合 所以最好返回给前台的时候使用json返回 如果你发现json给你多封装了一层比如:object{object{Key:name,Value:张三}} 不用担心 下面提供一个方法可以转换成object{name:张三}

      function getnewjson(dataResult)
        {
            var newJson =new Array();
            for (var i = 0; i < dataResult.length; i++) {
                var data_r = dataResult[i];
                var r_json = new Array();
                for (var f = 0; f < data_r.length; f++) {
                    r_json[data_r[f].Key] = data_r[f].Value;
                }
                newJson[i] = r_json;
              
            }
            return newJson;
        }
     
     ------------------------by cg 

    上面方法更新:支持多表不同字段命名的关系

    调用示例片段(1):
      string where = GetSearchWhere();//这里是拼接查询条件的 如 where 1=1
                string tables = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT";//多表查询 中的两张表 --以此类推
                List<string> list_ziduan = new List<string>();
                list_ziduan.Add("XM,LSH,SFZMHM,KSYY,YYCS,KSCS");//第一张表要查询的字段
                list_ziduan.Add("XH,SQCX,JGFS,KSY1DM,KSSJ");//第二张表要查询的字段 --以此类推
                List<dynamic> list_tj = new List<dynamic>();
                list_tj.Add(new { tableNames = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT", colName = "ZKZMBH" });//多表关联关系
           //或者这么写   list_tj.Add(new { tableNames = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT", colName = "ZKZMBH|ZKZMBH" });
                int count = 0;
                List<dynamic> list = SmileAngel.GetPageListMoreModel(out count, tables, list_ziduan, where, list_tj, "LSH",webpage.pageIndex-1, webpage.pageSize);
                ViewBag.list = list;
    调用片段(2):
     string where = " ";
                //E.KSKM,T.KSJH,T.KCDM,T.ZT,E.LSH,E.ZKZMBH,E.JSZH,E.XM,E.SQYY,E.SQCX,E.KSCS,E.KSSJ,E.JSSJ,E.JGFS,E.SYTS,E.SYSJ,E.KSY1XM,E.KSY2XM
                string tables = "EXAM_KS_TEMP,EXAM_KTXX";
                List<string> list_ziduan = new List<string>();
                list_ziduan.Add("KSKM,LSH,ZKZMBH,JSZH,XM,SQYY,SQCX,KSCS,KSSJ,JSSJ,JGFS,SYTS,SYSJ,KSY1XM,KSY2XM");
                list_ziduan.Add("KCDM,ZT,KSJH,MAC,IP,YYBB");
                List<dynamic> list_tj = new List<dynamic>();
                list_tj.Add(new { tableNames = "EXAM_KS_TEMP,EXAM_KTXX", colName = "KCDM" });
                list_tj.Add(new { tableNames = "EXAM_KS_TEMP,EXAM_KTXX", colName = "KSJH" });
                List<dynamic> list = SmileAngel.GetListMoreModel(tables, list_ziduan, where, list_tj, "LSH");
      
    --------------------
    Oracle中查询第一条 不能使用top(1) 要在后面加rownum = 1 
    如: select a from table where  rownum = 1 
    QQ:83199235
  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/softcg/p/6510944.html
Copyright © 2011-2022 走看看