作为开发,你是否经常碰到下面需要转换用户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 = ; i < arr.length; i++) {
if (arr[i] == rel) {
bFind = true;
break;
}
}
if (bFind == false) {
arr.push(rel);
}
}
});
if (arr.length == ) {
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('[') == && res.d.lastIndexOf(']') == res.d.length - ) {
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 = ; i < data.length; i++) {
if (data[i][] == rel) {
$(this).text(data[i][]);
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来保存数据,如果浏览器不支持或者数据不在里面,再进行查询。

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

很少再用left join的更多相关文章

  1. Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 ...

  2. 很少人知道的office专用卸载工具

    Microsoft Office是微软公司开发的一套基于 Windows 操作系统的办公软件套装.常用组件有 Word.Excel.Powerpoint等.当我们不需要再用了或者想安装旧版本的话,首先 ...

  3. DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)

    函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...

  4. 12个很少被人知道的CSS事实

    之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-l ...

  5. 为什么国外的 App 很少会有开屏广告?

    前言: 笔者在知乎看到这个问题,觉得这的确是一个值得关注和回答的现象,遂写了回答并整理成本文发布在此抛砖引玉,欢迎讨论. 正文: 古话说得好,先问是不是,再问为什么. 对于「国外的 App 很少有开屏 ...

  6. 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)

    作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  7. 11 个很少人知道但很有用的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  8. linux下snprintf和sprinf很少被提及的区别

    函数原型:int snprintf(char *dest, size_t size, const char *fmt, ...);函数说明: snprintf函数中的第二个参数,size的解释:siz ...

  9. 滚动效果marquee的用户体验不好,很少被用到,一般用jquery替代

    滚动效果marquee的用户体验不好,很少被用到,一般用jquery替代

随机推荐

  1. java class的兼容问题

    前不久在工作中,遇到了几次编译class引起的NoSuchMethodError,经过分析与测试验证,也算是搞清楚了中间的来龙去脉,现在把一些结论性的东西(附带一些过程性的分析)分享出来. 在使用ja ...

  2. 手把手写php框架中三大“自动功能”

    在很多php框架中都有自动过滤,自动填充,自动验证等三大自动功能,用来对POST表单传过来的数据进行加工,以便能够更加规范的导入数据库.这一功能在添加商品,添加商品分类中有很大的用处.比如thinkp ...

  3. Object.assign()方法

    对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...

  4. 123. Best Time to Buy and Sell Stock (三) leetcode解题笔记

    123. Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the pric ...

  5. Jmeter测试结果分析

    *.jtl文件内容: 请求发出的绝对时间,响应时间,请求的标签,返回码,返回消息,请求所属的线程,数据类型,是否成功,字节,             响应时间 1458294513309,   382 ...

  6. 关于Java深clone 的例子学习

    之前http://www.cnblogs.com/lhppom/p/4857702.html里有提到关于Java的深克隆的学习,深浅区别就是在于仅复制对象引用和复制对象引用所指向的对象,最近在看< ...

  7. 安安视频网anan.video为您提供免费高清视频

    安安视频网anan.video为您提供免费高清视频,最新电影,电视剧,动漫,微电影,纪录片,音乐MV在线观看(高清):安安视频网,一个干净的视频在线播放网站,百万高清影视,视频在线观看. 安安视频网整 ...

  8. [转]MySQL批量更新死锁案例分析

    文章出处:http://blog.csdn.net/aesop_wubo/article/details/8286215 问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常, ...

  9. VM12安装OS X10.11步骤及说明

    参考文献: 1. http://www.crsay.com/network/enable-hardware-based-dep.html 2. http://jingyan.baidu.com/art ...

  10. HibernateUtil

    package com.ssh.util; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.Standa ...