终于解决了”SQL多表连接查询C#化”这的问题
一直以来,涉及到多表查询操作时,原有的框架都需要自定义SQL语句或视图/存储过程来解决,一直想解决掉这个问题,但一直没腾出精力来,这个问题看似不痛不痒,但放在一边又始终是个问题,心里总是有些不爽.这几天花了点时间仔细研究了一下这个问题,似乎有了点思路,于是,出来了一个Joinner类.
主要解决的问题:
1.表别名问题
2.字段别名问题.
3.实体映射信息缓存问题.
4.映射信息获取的问题.
问题1/3是有关联的,因为映射信息跟表别名都涉及到数据表的信息,所以最后的解决办法是将映射信息复制一个新的实例出来,这样设置别名时就不会影响到原来的表了.
问题2比较简单,字段映射的类再扩展出一个别名字段映射的类加上别名属性就可以了,或者直接在字段映射信息的类中加上一个别名属性也是可以解决的.
问题4,因为所有的业务类都是继承自同一基类,而基类又是一个泛型类,所以在取业务类中的映射信息时碰到了点小问题.最后的解决办法是给业务基类定义一个接口IJoinAvailable,定义一个方法,返回映射信息就可以了.
最终使用的效果如下:
var join = new Joinner<User,Grade>((joinner,usr,gd)=>joinner
.Select(usr.ID,usr.UserName,usr.Password,gd.Name.As("GradeName"))
.From(usr)
.Select(usr.ID,usr.UserName,usr.Password,gd.Name.As("GradeName"))
.From(usr)
.LeftJoin(gd).On(usr.Grade,QueryOperate.Equal,dg.ID)
.Where(usr.State.Equal(1))
.OrderBy(usr.ID.Desc))
将实例join传给业务类的方法处理,就可以得到指定的数据了,目前可以解决项目中大部分连接查询的问题,算是不错了.
这个问题压抑了我很久,解决了它之后有种如释重负的感觉(虽然还负了很重),所以随手记录一下.