【发布时间】:2009-01-29 12:06:56
【问题描述】:
鉴于此针对 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。
【问题讨论】:
-
你有没有看到在你漂亮的 linq 或任何好的 c# 源代码之后,令人讨厌的程序集或 MSIL 是如何得到的?问题是如果它给出了正确的结果,我们为什么需要打扰。
-
感谢关于用 Substring 替换 StartsWith 的提示 - 这解决了 StartsWith 版本不匹配空字符串作为前缀的问题。
标签: sql entity-framework