作為開發,你是否經常碰到下面需要轉換用戶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來保存數據,如果瀏覽器不支持或者數據不在里面,再進行查詢。
很簡單,幾乎一勞永逸了吧!