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

前端之家收集整理的这篇文章主要介绍了由Entity Framework生成的SQL用于字符串匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定针对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.

猜你在找的MsSQL相关文章