Linq中小心使用IndexOf
我们平常在做字符串的模糊查询时,有可能会用到下面的类似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(它翻译的SQL为LIKE)。
Linq中小心使用IndexOf的更多相关文章
- Sliverlight linq中的数组筛选数据库中的数据
首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特 ...
- Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数
11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...
- Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
- 关于Linq中的Lambda表达式中OrderBy的深入理解
起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...
- Linq中关键字的作用及用法
Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...
- Linq 中按照多个值进行分组(GroupBy)
Linq 中按照多个值进行分组(GroupBy) .GroupBy(x => new { x.Age, x.Sex }) group emp by new { emp.Age, emp.Sex ...
- Linq 中的 left join
Linq 中的 left join 表A User: 表B UserType: Linq: from t in UserType join u in User on t.typeId equal u. ...
- LINQ中的一些查询语句格式
LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...
- Linq 中查询一个表中指定的字段
//Linq中查询一个表中指定的几个字段: ); // FindAllItems()为查询对应表的所有数据的方法: // Where 里面为查询条件 // Select 为查询的筛选条件 new{} ...
随机推荐
- Handler 原理分析和使用(二)
在上篇 Handler 原理分析和使用(一)中,介绍了一个使用Handler的一个简单而又常见的例子,这里还有一个例子,当然和上一篇的例子截然不同,也是比较常见的,实例如下. import andro ...
- oracle 过程函数,包的区别和联系
一.过程与函数区别 1.过程可以有0~N个返回参数,通过OUT or IN OUT参数返回:函数有且仅有1个返回值,通过return语句返回. 2.调用过程时,可做为单独的语句执行:调用函数时,函数必 ...
- SQL打印全年日历
数据库环境:SQL SERVER 2008R2 我之前有写过打印本月日历的SQL,里头有详细的说明.具体请参考前面的博文——生成本月日历. 全年日历只是在本月日历的基础上加了月信息,并按月份分组求得. ...
- C# 控制台窗口的显示与隐藏
1. 定义一个Consolse帮助类,如下: /// <summary> /// 控制台帮助类 /// </summary> public static class Conso ...
- ueditor之ruby on rails 版
最近公司的项目开始要使用ueditor了,但是ueditor却没有提供rails的版本,因此需要自己去定制化ueditor来满足项目的需求.不多说了,先简要说明下使用方法: ueditor目录下: 注 ...
- jquery 学习日记之选择器
看完Jquery选择器的教程视频后,对jquery的选择器有一定的认识和了解,现整理一下知识: 一.jquery基本选择器,这类比较简单,一笔带过. #id 选择器,是选择 匹配id值中的第一个元素 ...
- Android 安全概述
1. 保密: 信息.文档加密.解密 2. 鉴别.认证:就像确认与我们打电话的确实是XXX,而不是骗子 3. 完整性:信息不能被篡改, 4. 不可否认性:确定信息有who产生,并且将来不能否认
- Django国际化注意事项
涉及两部分内容: py/html文件国际化.外部js文件国际化 步骤 1. settings.py 激活相应的配置 2. 针对py文件,需要注意被翻译代码的编写方式 3. 针对html文件,需要注意被 ...
- 解决VS2015无法调试dotnet core项目
dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...
- sourceInsight的技巧
在用sourceInsight看代码...在这里积累技巧,慢慢积累吧 1.如何高亮显示所有要搜的东西,例如 1.aaaaaa 2. bbbbbbbbaaaaaaa 3. ccccccc 4. aaaa ...