可以使用NHibernate过滤器过滤引用吗?
人为的例子,但假设我有一个关于这些实体的例子:可以使用NHibernate过滤器过滤引用吗?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,人为的例子,但假设我有一个关于这些实体的例子: public class Root { public virtual Customer Customer { get; set; } } public class Customer { public virtual CustomerData Data { get; set; } } public class CustomerData { public virtual string FooName { get; set;
public class Root
{
public virtual Customer Customer { get; set; }
}
public class Customer
{
public virtual CustomerData Data { get; set; }
}
public class CustomerData
{
public virtual string FooName { get; set; }
}
现在,假设我想基于foonName的值为Root创建一个过滤器。直觉上,我在我的FooMap课程中尝试了这一点。使用流畅的映射
ApplyFilter("FooNameFilter", "Customer.Data.FooName in (:argument)");
这不管用。抛出SqlClient.SqlException,说明无法绑定多部分标识符“Customer.Data.FooName”。
有没有办法让过滤器以这种方式工作,或者我被迫将该逻辑移到所有
Query()
s中?可以工作的是,如果可能,将filter
移动到CustomerData
对象,或者创建应用于Customer
映射的“更复杂的SQL条件”。但它是关于纯SQL的,没有引用。过滤器是如何工作的
过滤器与where
子句相同,但可以在运行时进行调整。文件摘录
NHibernate增加了预定义筛选条件和附加的功能
这些过滤器同时位于类和集合级别过滤器
标准是定义非常相似的限制条款的能力
指向类上现有的“where”属性和各种
集合元素。除此之外,这些过滤条件可以
参数化。然后,应用程序可以在运行时做出决定
是否应启用给定的筛选器及其参数
价值观应该是正确的。过滤器可以像数据库视图一样使用,但是
在应用程序内部参数化
的定义,其中
:
其中(可选)指定检索此类对象时要使用的任意SQL where条件
换句话说,这些设置充当映射的“附加组件”。他们正在用更多的SQL平衡扩展它(包括where
和filter
)。筛选器可以在多个映射之间共享,并应用于一个会话内的所有查询,但它必须以列为目标:
condition=":myFilterParam = MY_FILTERED_COLUMN"
我打赌必须将逻辑转移到您的查询中。据我所知,过滤器是SQL,而不是HQL,因此您将无法使用直观的Customer.Data.FooName
连接语法。我认为过滤器必须是关于在一个表上定义的列。这就是我担心的。这并没有让我生气,但我真的很喜欢我所做的过滤API。给出了错误消息,这就是我认为在幕后发生的事情。我仍然不确定的是,我是否可以使用过滤器来实现这一点。我不确定筛选CustomerData在我想针对根用户筛选查询时有何帮助。我对NHibernate还很陌生,所以我还不确定我所有的选择都是什么。过滤器的本质主要在于收集处理。您可以拥有大型集合,或者依赖于区域性、用户名等。在这些情况下,可以使用筛选器。您可以了解当前会话(用户区域性)的限制,并将其设置为会话。将使用此设置筛选所有集合。但如果你想得到一个客户,这有一些设置。。。使用标准或查询api。您将在查询过程中“加入”客户数据并应用筛选器。当我试图解释如何使用筛选器时,有一些链接指向此主题,听起来好像我误用了它们。谢谢很好,如果这能有所帮助;)