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{} ...
随机推荐
- android studio 无法在可视化页面预览布局文件
Rendering Problems the following classes could not be found:android.support.v7.internal.widget.Actio ...
- SQL server 跨库插入数据
1.INSERT INTO SELECT语句 语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Ta ...
- CodeSmith中SchemaExplorer属性的介绍
CodeSmith与数据库的联系,在CodeSmith中自带一个程序集SchemaExplorer.dll,这个程序集中的类主要用于获取数据库中各种对象的结构. <%@ Property Nam ...
- JAVA 函数式接口与c#委托对应关系(一)
C# Action委托 VS JAVA Action 接口函数 1.c#:Action 封装一个方法,该方法不具有参数并且不返回值. 构造实体类类 using System; namespace Ac ...
- ACM HDU 2674 N! Again(数论)
继续数论.. Problem Description WhereIsHeroFrom: Zty,what are you doing ? Zty: ...
- 关于php的一些开源程序
最好用的当属thinksns,目前更新到4.3.4, 社交型网站. 此网站提供大量源码,有时间可以去看看:http://down.admin5.com/
- 自己使用Jquery封装各种功能分享
自己使用Jquery封装各种功能分享: 左右滚动图片 瀑布流 流动显示列表 广告切换 头像切换And广告切换 获取搜索引擎的来源关键字 上面列表中展示的功能都是使用jquery进行封装实现的,希望大家 ...
- Struts2输入校验
1.编写校验规则文件 (<ActionName>-validation.xml),文件放在Action类文件相同的路径下校验失败返回input的result. <vali ...
- 《C和指针》章节后编程练习解答参考——第8章
8.1 #include <stdio.h> int main (void) { int a, b, c, d; // 不使用嵌套花括号初始化 unsigned ][][][] = { , ...
- Android Studio HelloWorld
开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a new Android Studio Project创建工程: 接下来需要输入应用名称(第一个字母要大写 ...