zoukankan      html  css  js  c++  java
  • 很少再用left join

    作为开发,你是否经常碰到下面需要转换用户ID成用户名称的情况:

    可惜你的这些业务表出于最少冗余设计要求,只有UserId,而没有UserName,这时你不得不破坏你一个类封装一个表的美好想法,

    在你的查询写上

    SELECT a.*,b.Name FROM OrderInfo a LEFT JOIN UserInfo b ON a.UserID=b.ID
    

    你如果用linq的话,可能代码更多一下:

     var query = from A in db.OrderInfo
                            join B in db.UserInfo on A.UserId equals B.ID
                            select new
                            {
                               A.UserId,
                              ..........
                              B.Name
                            };
    

    更麻烦的是,你对这个表写的Model无法再适用这个查询,你不得不重新创建和维护一个新的数据ViewModel(前台展示)与查询对应。

    我在一个历史项目中查找到上百行的LEFT JOIN UserInfo b ON a.UserID=b.ID,增加了大量新的ViewModel,并使单个表查询的封装类看起来十分不好维护。

    你可能需要下面这个更简洁的方法:查询不再left jion,查询到的UserId直接显示在前台,通过Ajax查询用户列表来更新成UserName。

    具体的步骤:

    1.查询用户ID,Name数据(这里是WebForm的.asmx查询,MVC自然更简单了)

    webservice:
    
    [System.Web.Script.Services.ScriptService]
    public class CommonAjax : System.Web.Services.WebService {
    
        public CommonAjax()
        {
    
            //如果使用设计的组件,请取消注释以下行 
            //InitializeComponent(); 
        }
    
        [WebMethod]
        public string GetUserNameList(string ids)
        {
            return new PublicUseBLL().GetNameList_Json(ids);
        }
        
    }
    BLL:
      省略,调用DAL即可
    
    DAL:
     public string GetNameList_Json(string ids)
            {
                StringBuilder sBuilder = new StringBuilder();
                string sql = "select ID,Name FROM PublicUser where Del=0 order by ID";
                if ( !string.IsNullOrEmpty(ids) )
                {
                    sql = string.Format("select ID,Name FROM PublicUser where Del=0 and ID in({0})  order by ID",ids);
                }
                var ds = DbHelperSQL.Query(sql);
                int rows = ds.Tables[0].Rows.Count;
                DataRow dr;
                sBuilder.Append("[");
    
                if (rows > 0)
                {
                    for (int i = 0; i < rows-1; i++)
                    {
                        dr = ds.Tables[0].Rows[i];
                        sBuilder.Append(string.Format("[{0},"{1}"],", dr[0], dr[1]));
                    }
                    dr = ds.Tables[0].Rows[rows-1];
                    sBuilder.Append(string.Format("[{0},"{1}"]", dr[0], dr[1]));
                }
                sBuilder.Append("]");
                
                return  sBuilder.ToString();
            }
    

     

    封装查询和替换函数,把这个函数放在你的公共js函数文件Common.js里:

    function replaceUserName() {
        var arr = [];
        var rel;
        //获取需要转换的id,拼成ids
    $(
    '.re_name').each(function () { rel = $(this).attr('rel'); if (typeof rel != 'undefined' && checkInteger(rel)) { var bFind = false;//这里当然要过滤重复了 for (var i = 0; i < arr.length; i++) { if (arr[i] == rel) { bFind = true; break; } } if (bFind == false) { arr.push(rel); } } }); if (arr.length == 0) { return false; } $.ajax({ type: "POST", contentType: "application/json", url: '/Ajax/CommonAjax.asmx/GetUserNameList', data: '{"ids":"' + arr.join(',') + '"}',//data: '{"ids":""}',// dataType: "json", async: false, success: function (res, status) { if (res.d.indexOf('[') == 0 && res.d.lastIndexOf(']') == res.d.length - 1) { var data = jQuery.parseJSON(res.d); //替换id
              $(
    '.re_name').each(function () { rel = $(this).attr('rel');
    //判断id有效性
    if (typeof rel != 'undefined' && checkInteger(rel) ) { rel = parseInt(rel); for (var i = 0; i < data.length; i++) { if (data[i][0] == rel) { $(this).text(data[i][1]); break; } } } }); } else { alert(res.d); } } }); }

    现在,封装完成了。在你替换ID的页面,显示ID的地方需要加上替换标志

    
    
    '<td class="center re_name" rel="' + row['UserId'] + '">' + row['UserId'] + '</td>'
    
    

    重点是有class: re_name 且rel的值是UserID

    替换:如果你的数据展示是异步的(当然你这里肯定是一次查询整张数据表)

    $.ajax({
                   ........
                    dataType: "json",
                    async: false,
                    success: function (res, status) {
                            .....
                            //全部数据转html后调用
                            replaceUserName();
                       
                    }
                });
    

      

    如果是绑定.net控件的方式更简单了,直接在jquery中实现

    $(function() {
    
     replaceUserName();
    
    }); 
    

    只需要改动两行代码,你就可以看到:

    完全没有感觉不到有替换过程。当然以上事例刚好所有ID相同,但是与代码没有半点关系。

    更进一步,你可以用html5的localstorage来保存数据,如果浏览器不支持或者数据不在里面,再进行查询。

    很简单,几乎一劳永逸了吧!

  • 相关阅读:
    Windows 8实例教程系列 开篇
    qt 开发发布于 windeploy.exe
    qt qoci 测试验证
    vmware vmx 版本不兼容
    qt oracle
    vc qt dll
    QOCIDriver unable to create environment
    qoci 编译完 放置位置 具体根据情况
    calling 'lastError' with incomplete return type 'QSqlError' qsqlquer
    Hbase 操作工具类
  • 原文地址:https://www.cnblogs.com/ninestates/p/3411821.html
Copyright © 2011-2022 走看看