翼度科技»论坛 编程开发 .net 查看内容

真的被Sqlsugar给气到了!

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
博客园潜水多年,账号都搞忘记好几个,一直没有写什么东西,但是这次真忍不了了,被sqlsugar出现的奇葩问题和作者的奇葩处理方式给气到了。
起因是在使用Sqlsugar过程中,偶然发现了一个问题,确认这个问题真实存在后,我就去提了issue:
模糊查询遭遇特殊符号时的问题 · Issue #1303 · DotNetNext/SqlSugar
 
省流说明: 问题大概就是,当模糊搜索的关键词是  %% 时,sqlsugar 会将sql生成   like  '%%%%' 这样。由于 %%%% 允许名字包含任意数量的字符,这个模式实际上会匹配 字段中的任何值。换句话说,这个 LIKE 条件没有提供任何过滤,因此它相当于没有指定任何条件。
 
本身这个问题很简单,我甚至都不太相信开源多年,这么大用户量的ORM会有这种低级的问题。但是作者的回复真的把我惊到了:

 
就是不改,还狡辩称很多ORM都不会去处理这个
 
昨天忙,没时间理这个,今天空闲了,然后就做了下测试,选择了三个最常用的ORM:Freesql,SqlSugar,EF Core。
 
ORM版本号
Freesql3.2.833
SqlsugarCore5.1.4.17
EF CORE8.0.11
 
测试代码如下:
 
  1. var word = "%%";
  2. Console.WriteLine("  ");
  3. Console.WriteLine("  ");
  4. Console.WriteLine("FreeSql:");
  5. var list1 = freeSql.Select<Student>().Where(t => t.Name.Contains(word)).ToList();
  6. Console.WriteLine("  ");
  7. Console.WriteLine("  ");
  8. Console.WriteLine("SqlSugar:");
  9. var list2 = sqlSugarClient.Queryable<Student>().Where(t => t.Name.Contains(word)).ToList();
  10. Console.WriteLine("  ");
  11. Console.WriteLine("  ");
  12. Console.WriteLine("EF CORE:");
  13. var list3= dbContext.Students.Where(t => t.Name.Contains(word)).ToList();
复制代码
 
执行结果如下:
  1. FreeSql:
  2. Sql:SELECT a.`Id`, a.`Name`, a.`Age`, a.`GradeId`
  3. FROM `student` a
  4. WHERE (locate('%%', a.`Name`) > 0)
  5. SqlSugar:
  6. SELECT `Id`,`Name`,`Age`,`GradeId` FROM `student`  WHERE  (`Name` like concat('%',@MethodConst0,'%'))
  7. {"@MethodConst0":"%%"}
  8. EF CORE:
  9. warn: Microsoft.EntityFrameworkCore.Model.Validation[10400]
  10.       Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development.
  11. info: Microsoft.EntityFrameworkCore.Database.Command[20101]
  12.       Executed DbCommand (3ms) [Parameters=[@__word_0_contains='%\%\%%' (Size = 4000)], CommandType='Text', CommandTimeout='30']
  13.       SELECT `s`.`Id`, `s`.`Age`, `s`.`GradeId`, `s`.`Name`
  14.       FROM `student` AS `s`
  15.       WHERE `s`.`Name` LIKE @__word_0_contains
复制代码
 

 

 
从上述结果可以明显看到,Freesql使用了 locate 函数来实现模糊搜索;EF CORE 对 % 进行了转义(__word_0_contains='%\%\%%') 。 唯独Sqlsugar,就是个奇葩,完全不处理!作者还强词夺理的狡辩!
 
SON OF BISCUIT !
 

来源:https://www.cnblogs.com/diamondhusky/p/18548492
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具