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
  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/softcg/p/6510944.html
Copyright © 2011-2022 走看看