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 
posted @ 2017-03-06 17:18  Tracy9999  阅读(995)  评论(0编辑  收藏  举报