2012-08-10 54 views
-1

。凡(X => x.Rated!) 这将创建的SQL,看起来像: 没有(cdrcalltmp0_.Rated = 1)获取连贯NHibernate不使用参数

我们的DBA说,我不得不删除不适合一些过滤的索引工作。

。凡(X => x.Rated ==假) 这将创建的SQL,看起来像:通过cdrcalltmp0_.Created ASC”

这并不因为工作 [email protected]秩序参数。

他想这个SQL:由cdrcalltmp0_.Created ASC”

cdrcalltmp0_.Rated = 0顺序是有可能使NHibernate的不使用参数? 这样过滤的索引就可以工作。

+1

“由于参数,这不起作用。”为什么不工作? – Jaguar 2012-08-10 10:03:58

+0

同意,什么概率与“这是因为参数不起作用。” – Chev 2012-08-10 11:27:29

+0

对不起,我不知道为什么索引不能使用参数。我猜应该。 – Anders 2012-08-10 13:19:23

回答

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: [email protected] order by cdrcalltmp0_.Created asc' 

是完全有效的。当SQL Server收到参数化查询时,它将使用您的“额定”列中的任何索引。

如果您的DBA仍然怀疑您,请告诉他在Sql Server Management Studio中运行带有“显示估计执行计划”功能的查询。这将证明查询正在使用索引。

+0

不要太确定。因为SQL Server 2000将它解释为WHERE CAST(SomeBitColumn AS INT)= 1'而不是'WHERE SomeBitColumn = CAST(1 AS BIT)',所以SQL Server 2000甚至不使用索引来清除WHERE SomeBitColumn = 1。我知道这已经得到了改进,但它很大程度上取决于所使用的SQL Server的确切版本。这个问题甚至没有明确指定SQL Server完全被使用,而不是某些其他数据库引擎(但是毫无疑问,语法看起来像它)。 – hvd 2012-08-10 23:10:29

+0

@ hvd好点。我将更新我的答案,序言我所做的陈述对于SQL Server 2008是正确的。 – 2012-08-10 23:35:35

+0

更新:这是一个过滤的索引。有时nhibernate不使用参数。出于某种原因,我的原始问题中的第一个示例不使用参数 – Anders 2012-08-13 08:53:55