可以使用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。您将在查询过程中“加入”客户数据并应用筛选器。当我试图解释如何使用筛选器时,有一些链接指向此主题,听起来好像我误用了它们。谢谢很好,如果这能有所帮助;)