Linq中小心使用IndexOf

时间:2022-01-03 02:32:03

 

我们平常在做字符串的模糊查询时,有可能会用到下面的类似LINQ写法:

string.IsNullOrEmpty(_SN) ? true : a.SN.IndexOf(_SN) != -1

 

这条LINQ翻译为SQL如下:

( ( 。

返回的开始位置从 1 开始,而非从 0 开始。

分析以下几种情况:

 

表达式2为空白值的情况

SELECT ( 为空值(NULL)的情况

 

SELECT ( CASE

           WHEN ( ( '123456' IS NULL )

                   OR ( ( Cast(Len('123456') AS INT) ) = 0 ) ) THEN Cast(1 AS BIT)

           WHEN ( NOT ( ( -1 = ( ( Cast(Charindex('123456', null) AS INT) ) - 1 ) )

                        AND ( ( Cast(Charindex('123456', null) AS INT) ) - 1 IS NOT NULL ) ) ) THEN Cast(1 AS BIT)

           WHEN ( -1 = ( ( Cast(Charindex('123456', null) AS INT) ) - 1 ) ) THEN Cast(0 AS BIT)

         END )

 

结果为1

 

测试其关键部分

SELECT ( CASE

           WHEN ( NOT(( -1 = ( ( Cast(Charindex('123456', null) AS INT) ) - 1 ) )

                        AND ( ( Cast(Charindex('123456', null) AS INT) ) - 1 IS NOT NULL ) ) ) THEN Cast(1 AS BIT)

         END )

结果为1

 

也就是说,当表中要查找的列中存在空值时,用indexOf会把所有空值列查出来。

 

其原因就是上文所说的黄色部分,注意那个NOT,它放错了位置!

正确方式如下:

SELECT ( CASE

           WHEN ( ( '123456' IS NULL )

                   OR ( ( Cast(Len('123456') AS INT) ) = 0 ) ) THEN Cast(1 AS BIT)

           WHEN ( ( NOT( -1 = ( ( Cast(Charindex('123456', null) AS INT) ) - 1 ) )

                        AND ( ( Cast(Charindex('123456', null) AS INT) ) - 1 IS NOT NULL ) ) ) THEN Cast(1 AS BIT)

           WHEN ( -1 = ( ( Cast(Charindex('123456', null) AS INT) ) - 1 ) ) THEN Cast(0 AS BIT)

         END )

 

结果为NULL

 

结论:

当我们在模糊查询时,如果确定要查的列没有NULL值,可以使用indexOf,否则要考虑其它方式,比如Contains(它翻译的SQLLIKE)。

Linq中小心使用IndexOf的更多相关文章

  1. Sliverlight linq中的数组筛选数据库中的数据

    首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特 ...

  2. Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数

    11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...

  3. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  4. 关于Linq中的Lambda表达式中OrderBy的深入理解

    起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...

  5. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  6. Linq 中按照多个值进行分组&lpar;GroupBy&rpar;

    Linq 中按照多个值进行分组(GroupBy) .GroupBy(x => new { x.Age, x.Sex }) group emp by new { emp.Age, emp.Sex ...

  7. Linq 中的 left join

    Linq 中的 left join 表A User: 表B UserType: Linq: from t in UserType join u in User on t.typeId equal u. ...

  8. LINQ中的一些查询语句格式

    LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...

  9. Linq 中查询一个表中指定的字段

    //Linq中查询一个表中指定的几个字段: ); // FindAllItems()为查询对应表的所有数据的方法: // Where 里面为查询条件 // Select 为查询的筛选条件 new{} ...

随机推荐

  1. 如何发布带静态资源的库——android 篇

    1.首先要使用 android sdk 提供的命令行工具处理已有的项目: cd YourProjectDir android update project -p ./ 2.上一步生成的 build.x ...

  2. 一个linux的样本分析

    不久前收到的一个linux样本,之前linux平台下的样本见得并不多,正好做个记录. 样本启动之后,会将自身重命名拷贝到/usr/bin下,并删除自身,如此处就将自身文件amdhzbenfi命名为us ...

  3. 爬虫技术 -- 进阶学习(八)模拟简单浏览器(附c&num;代码)

    由于最近在做毕业设计,需要用到一些简单的浏览器功能,于是学习了一下,顺便写篇博客~~大牛请勿喷,菜鸟练练手~ 实现界面如下:(简单朴素版@_@||) button_go实现如下: private vo ...

  4. ubuntu JDK

    第一步:下载jdk-7-linux-i586.tar.gz 第二步:解压安装 cd /usr/libsudo mkdir jvm cd {你的目录jdk压缩文件目录} sudo tar zxvf jd ...

  5. 【次小生成树】bzoj1977 &lbrack;BeiJing2010组队&rsqb;次小生成树 Tree

    Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...

  6. Python基础(函数-递归)

    本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...

  7. kubespray 容器存储设备 -- rook ceph

    1./root/kubespray/roles/docker/docker-storage/defaults/main.yml  #在用kubespray部署集群是制定docker用什么设备 dock ...

  8. 1090&period; Highest Price in Supply Chain &lpar;25&rpar;-dfs求层数

    给出一棵树,在树根出货物的价格为p,然后每往下一层,价格增加r%,求所有叶子节点中的最高价格,以及该层叶子结点个数. #include <iostream> #include <cs ...

  9. &lbrack;UOJ266&rsqb;Alice和Bob又在玩游戏

    [UOJ266]Alice和Bob又在玩游戏 Tags:题解 作业部落 评论地址 TAG:博弈 题意 不同于树的删边游戏,删掉一个点删去的是到根的路径 题解 这题只和计算\(SG\)有关,博弈的有关内 ...

  10. Scrum Meeting Beta - 9

    Scrum Meeting Beta - 9 NewTeam 2017/12/8 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 解决离线状态下启动时报错的问题Issue #15 ...

相关文章