很少再用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來保存數據,如果瀏覽器不支持或者數據不在里面,再進行查詢。

 

很簡單,幾乎一勞永逸了吧!

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM