前言:
下面的答案是假设您使用的是 SQL Server 2008。如果您不是,那么在使用 NOT 运算符时,所讨论的数据库技术很可能不支持索引。因此,如果您使用 SQL Server 2008...
您的 DBA 不知道他在说什么。
以下语法
NOT ( SomeTableAlias.SomeTableColumn = 1 )
SQL Server 查询分析器绝对可以理解。我从 NHibernate 得到的查询看起来与上面的语法完全一样,而且它们确实使用了正确的索引。
回答你的问题,不。NHibernate 在为您创建 SQL 时总是使用参数。参数化查询非常常见,即使您自己使用传统的 ADO.NET。
让 NHibernate 不使用参数的唯一方法是使用 session.CreateSQLQuery() 方法提供它自己执行所需的 SQL。
无论如何,您发布的上述行:
Where(x => x.Rated == false) This creates sql that looks like: cdrcalltmp0_.Rated=@p2 order by cdrcalltmp0_.Created asc'
是完全有效的。当 SQL Server 接收到参数化查询时,它将使用您的额定列上的任何索引。
如果您的 DBA 仍然怀疑您,请告诉他在 Sql Server Management Studio 中运行查询,并启用“显示估计执行计划”功能。这将证明查询正在使用索引。