2

人为的例子,但假设我有这些实体:

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 类中尝试了这个。使用流畅的映射。

ApplyFilter("FooNameFilter", "Customer.Data.FooName in (:argument)");

这行不通。抛出 SqlClient.SqlException 说明The multi-part identifier "Customer.Data.FooName" could not be bound.

有没有办法让过滤器以这种方式工作,或者我是否被迫将该逻辑移动到所有Query<Root>()s 中?

4

1 回答 1

1

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

与子句filters相同where,但可以在运行时进行调整。文档18.1的摘录。NHibernate 过滤器

NHibernate 增加了预定义过滤条件并在类和集合级别附加这些过滤器的能力。过滤条件是定义限制子句的能力,该子句与类和各种集合元素上可用的现有“where”属性非常相似。除了这些过滤条件可以参数化。然后应用程序可以在运行时决定是否应该启用给定的过滤器以及它们的参数值应该是什么。过滤器可以像数据库视图一样使用,但在应用程序内部进行了参数化。

的定义where

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

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

condition=":myFilterParam = MY_FILTERED_COLUMN"
于 2013-08-28T04:05:55.530 回答