有争议的例子,但是假设我有这些实体:
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; }
}
现在,假设我想根据FooName的值为Root创建一个过滤器。直觉上,我在我的FooMap类中尝试过这个。使用Fluent映射。
ApplyFilter("FooNameFilter", "Customer.Data.FooName in (:argument)");
这不起作用。抛出SqlClient.SqlException,说明The multi-part identifier "Customer.Data.FooName" could not be bound.
有没有办法让过滤器以这种方式工作,或者我是否被迫将该逻辑转移到所有Query<Root>()
中?
答案 0 :(得分:1)
可行的方法是尽可能将filter
移动到CustomerData
对象,或者在Customer
映射上创建“更复杂的SQL条件”。但它是关于纯SQL,没有引用。过滤器如何工作?
filters
与where
子句相同,但可以在运行时调整。文档摘录18.1. NHibernate filters
NHibernate增加了预定义过滤条件和附加功能 那些类和集合级别的过滤器。 过滤器 标准是非常类似地定义限制条款的能力 到现有的“where”属性可用于类和各种 收集元素。除了这些过滤条件可以 参数。然后,应用程序可以在运行时做出决定 是否应启用给定的过滤器以及它们的参数 价值应该是。过滤器可以像数据库视图一样使用,但是 在应用程序内参数化。
where
:
其中(可选)指定在检索此类对象时使用的任意SQL WHERE条件
换句话说,这些设置充当我们的映射“添加”。他们正在使用更多 SQL balast 扩展它(where
和filter
)。过滤器可以在多个映射之间共享,并应用于一个会话中的所有查询,但必须以列为目标:
condition=":myFilterParam = MY_FILTERED_COLUMN"