4

我之前在映射层中使用了 where 子句,以防止某些记录以可能的最低级别进入我的应用程序。(主要是为了防止不得不重写很多行代码来过滤掉不需要的记录)

这些很简单,一列查询,就像这样

this.Where("Invisible = 0");

但是,出现了需要使用existssql 查询的情况。

exists (select ep_.Id from [Warehouse].[dbo].EventPart ep_ where Id = ep_.EventId and ep_.DataType = 4

在上述情况下,我通常会Event用一个短名称来引用父表,即,event_.Id但是由于 Nhibernate 会动态生成这些短名称,所以不可能知道它会是什么。

所以我尝试使用 just Id, 从上面ep_ where Id = ep_.EventId

运行代码时,由于动态短名称,EventPart 表短名称ep_有另一个短名称前缀,event0_.ep_其中event0_指父表。

这会导致 SQL 错误,因为 . 介于两者event0_之间ep_

所以在我的EventMap我有以下

this.Where("(exists (select ep_.Id from [isnapshot.Warehouse].[dbo].EventPart ep_ where Id = ep_.EventId and ep_.DataType = 4)");

但是当它生成时它会创建这个

select cast(count(*) as INT) as col_0_0_
from [isnapshot.Warehouse].[dbo].Event event0_
where (exists (select ep_.Id from [isnapshot.Warehouse].[dbo].EventPart event0_.ep_ where event0_.Id = ep_.EventId and ep_.DataType = 4)

它已正确添加event0_Id

是否构建了映射层 where 子句来处理这个问题,如果是,我哪里出错了?

4

3 回答 3

1

尝试将方括号放在别名周围,如下所示:

exists (select ep_.Id from [Warehouse].[dbo].EventPart [ep_] where Id = ep_.EventId and ep_.DataType = 4
于 2012-09-06T07:50:49.070 回答
0

在定义 ep_ 别名时尝试使用“as”关键字。

于 2012-09-03T22:14:44.380 回答
0

NHibernate.SqlCommand.Template 类有一个修改 Where 子句的方法 (RenderWhereStringTemplate)。查看代码,我认为问题在于它认为 ep_ 是一个标识符(基本上是映射类的一个属性),所以它用表的前缀作为前缀。确定它是否是标识符的代码非常简单——它基本上检查它是否被引用,或者它是否以 az 开头并且不包含 .

我认为最简单的解决方案是将别名从 ep_ 更改为 _ep - 我通常使用 2 _ 来确保它不会与 NHibernate 生成的前缀冲突。

于 2012-09-05T17:49:46.313 回答