SQLSugar动态拼接Lambda表达式(顺便提一个sqlsugar框架的bug)

 .netcore项目使用了ORM实体映射的方式,通过操作实体类进行数据库交互。

SQLSugar其中涉及动态表以及动态列的问题,请参考zwb我总结的一点心得,简单明了:

动态表--相同列名不同表,可使用一个实体类映射。查询代码写法:this.Queryable<D_PRJ>().AS("D_PRJ"+UNITSYS). 增删改查皆可以。

 

动态列--传统的list.where(p=>p.xx=="zwb")这种lambda表达式的写法已经不能满足 xx是个字符串变量的情况,而通过实体属性反射来处理如下:

list.where(p=>p.GetType().GetProperty("xx").GetValue().ToString()=="aa")在LinQ中好用,但sqlsugar并不支持。那么如何通过sqlsugar解决动态列的问题呢?请大家继续往下看:
http://www.codeisbug.com/Doc/8/1127这是官网示例。代码使用场景:

 

 

 

对List<ConditionalModel>集合的ADD添加的条件之间的关系是and的关系

但当我们想tidi把一些条件用or的关系连接在一起怎么处理?官网中用到了conditionalCollections(){}

这个所谓的集合就相当于sql里的括号,可以将几个条件括在里面,里面的条件可以用or连接,避免与外面条件的耦合,其中wheretype可以是or或者and

 

最后提一个sqlsugar的Bug,我觉得sqlsugar开发者还不知道这个问题吧。不爱打字了 直接上图吧:

 

 

 

如果我们进行搜索条件拼装时,检索条件多个时,会导致oracle错误。当我们输入一个条件模糊查询时候可以,多个条件模糊查询就报错为什么呢?如下:

 

 

如上图:实际我们用代码动态拼接的所有条件在sqlsugar内部是这样为我们生成可执行sql语句的,它会为每一个参数设置一个动态形成的参数名称,名称组成如下:固定前缀+列名+流水号后缀。

最后的流水号是动态生成的,参数越多,流水号越大,当这个参数长度超过30的时候,oracle就会报上面那个错误。

 

遇到问题要解决,这明显是sqlsugar内部机制的bug问题,但坑还要有人填。填坑很简单,动态循环自己拼接where条件吧,虽然我一向并不建议在sqlsuger中写sql语句,但是没办法。

 

 

 

http://www.codeisbug.com/Doc/8/1127

 

posted @ 2020-05-07 14:25  zwbsoft  阅读(4174)  评论(0编辑  收藏  举报