由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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |