Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在NHibernate映射层中使用复杂where子句_C#_Sql_Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# 在NHibernate映射层中使用复杂where子句

C# 在NHibernate映射层中使用复杂where子句,c#,sql,nhibernate,nhibernate-mapping,C#,Sql,Nhibernate,Nhibernate Mapping,我以前在映射层中使用了where子句,以防止某些记录以尽可能低的级别进入我的应用程序。主要是为了防止必须重新编写大量代码来过滤掉不需要的记录 这些都是简单的单列查询,就像这样 此值为0 然而,出现了一个需要使用exists sql查询的场景 存在从[Warehouse].[dbo].EventPart ep_uId中选择ep_Id,其中Id=ep_Id.EventId和ep_Id.DataType=4 在上面的例子中,我通常会用一个短名称引用父表事件,即Event_u1;Id。然而,当Nhibe

我以前在映射层中使用了where子句,以防止某些记录以尽可能低的级别进入我的应用程序。主要是为了防止必须重新编写大量代码来过滤掉不需要的记录

这些都是简单的单列查询,就像这样

此值为0

然而,出现了一个需要使用exists sql查询的场景

存在从[Warehouse].[dbo].EventPart ep_uId中选择ep_Id,其中Id=ep_Id.EventId和ep_Id.DataType=4

在上面的例子中,我通常会用一个短名称引用父表事件,即Event_u1;Id。然而,当Nhibernate动态生成这些短名称时,不可能知道它将是什么

所以我试着只使用Id,从上面的ep_uu,其中Id=ep_uu.EventId

运行代码时,由于存在动态短名称,EventPart表短名称ep_uu的前缀是另一个短名称event0。ep_u,其中event0_u引用父表

这会导致SQL错误,因为发生了错误。在事件0和ep之间

因此,在我的事件图中,我有以下内容

this.Whereexists从[isnapshot.Warehouse].[dbo].EventPart ep_u中选择ep_uu.Id,其中Id=ep_u.EventId,ep_u.DataType=4

但当它被生成时,它就产生了这个

选择castcount*作为INT作为col\u 0\u 0_ 来自[isnapshot.Warehouse].[dbo]。事件0_ 如果存在,请从[isnapshot.Warehouse].[dbo].EventPart event0\u0.ep\u0中选择ep\u0.Id,其中event0\u0.Id=ep\u0.EventId,ep\u0.DataType=4

它已正确地将event0添加到Id


映射层where子句是用来处理这个问题的吗?如果是的话,我错在哪里?

在定义ep_uuu别名时尝试使用as关键字。

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


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

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

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

这是哪个NHibernate版本?@Oskar目前正在使用3.3.1.4000。不幸的是,同样的问题。它仍然将事件0添加到开始。哇,这非常简单。