是否可以使用NHibernate过滤器来过滤引用?

时间:2013-08-27 14:10:23

标签: 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; }
}

现在,假设我想根据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>()中?

1 个答案:

答案 0 :(得分:1)

可行的方法是尽可能将filter移动到CustomerData对象,或者在Customer映射上创建“更复杂的SQL条件”。但它是关于纯SQL,没有引用。过滤器如何工作?

filterswhere子句相同,但可以在运行时调整。文档摘录18.1. NHibernate filters

  

NHibernate增加了预定义过滤条件和附加功能   那些类和集合级别的过滤器。 过滤器   标准是非常类似地定义限制条款的能力   到现有的“where”属性可用于类和各种   收集元素。除了这些过滤条件可以   参数。然后,应用程序可以在运行时做出决定   是否应启用给定的过滤器以及它们的参数   价值应该是。过滤器可以像数据库视图一样使用,但是   在应用程序内参数化。

where

的定义
  

其中(可选)指定在检索此类对象时使用的任意SQL WHERE条件

换句话说,这些设置充当我们的映射“添加”。他们正在使用更多 SQL balast 扩展它(wherefilter)。过滤器可以在多个映射之间共享,并应用于一个会话中的所有查询,但必须以列为目标:

condition=":myFilterParam = MY_FILTERED_COLUMN"