加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

由Entity Framework生成的SQL用于字符串匹配

发布时间:2020-12-12 07:07:15 所属栏目:MsSql教程 来源:网络整理
导读:给定针对EF数据上下文的 linq查询: var customers = data.Customers.Where(c = c.EmailDomain.StartsWith(term)) 你希望它能像这样产生SQL,对吗? SELECT {cols} FROM Customers WHERE EmailDomain LIKE @term+’%’ 嗯,实际上,它确实是这样的: SELECT {col
给定针对EF数据上下文的 linq查询:
var customers = data.Customers.Where(c => c.EmailDomain.StartsWith(term))

你希望它能像这样产生SQL,对吗?

SELECT {cols} FROM Customers WHERE EmailDomain LIKE @term+’%’

嗯,实际上,它确实是这样的:

SELECT {cols} FROM Customer WHERE ((CAST(CHARINDEX(@term,EmailDomain) AS int)) = 1)

你知道为什么吗?

另外,将Where选择器替换为:

c => c.EmailDomain.Substring(0,term.Length) == term

它的运行速度提高了10倍,但仍会产生一些非常令人讨厌的SQL.

注意:Linq to SQL正确地将StartsWith转换为Like {term}%,并且nHibernate具有专用的LikeExpression.

解决方法

原因是,与LIKE相比,CharIndex比SQL更快更清洁.原因是,你可以有一些疯狂的“LIKE”条款.例:
SELECT * FROM Customer WHERE EmailDomain LIKE 'abc%de%sss%'

但是,“CHARINDEX”函数(基本上是“IndexOf”)只处理查找一组字符的第一个实例……不允许使用通配符.

那么,你的答案是:)

编辑:我只是想补充一点,我鼓励人们在他们的SQL查询中使用CHARINDEX来获取他们不需要“喜欢”的东西.值得注意的是,在SQL Server 2000中,“Text”字段可以使用LIKE方法,但不能使用CHARINDEX.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读