给定针对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.