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
本文来自博客园,作者:zwbsoft,转载请注明原文链接:https://www.cnblogs.com/zwbsoft/p/12841051.html
电话微信:13514280351