-1

.Where(x => !x.Rated) 这创建的 sql 看起来像: not (cdrcalltmp0_.Rated=1)

我们的 dba 说我必须删除 not 才能使某些过滤索引起作用。

.Where(x => x.Rated == false) 这将创建如下所示的 sql: cdrcalltmp0_.Rated=@p2 order by cdrcalltmp0_.Created asc'

由于参数,这不起作用。

他想要这个sql:cdrcalltmp0_.Rated=0 order by cdrcalltmp0_.Created asc'

是否可以让 nhibernate 不使用参数?以便过滤索引起作用。

4

1 回答 1

0

前言: 下面的答案是假设您使用的是 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 中运行查询,并启用“显示估计执行计划”功能。这将证明查询正在使用索引。

于 2012-08-10T22:55:35.150 回答