NHibernate过滤器未应用于急切获取的子实体

时间:2012-04-25 12:35:41

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有以下数据模型:

Category
  Date
  Products

Product
  Date
  Payments

Payment
  Date

我希望使用NHibernate加载整个树。我想这样做:

var query = from cat in session.Query<Category>() select cat;     
query = query.FetchMany(c => c.Products).ThenFetch(c=>c.Payments);     
var result = query.Distinct().ToList();

这很好用。它创建一个左外连接并返回结果。

但我也只想获得比01/01/2012更新的实体。所以我创建了一个名为DateFilter的过滤器,并将以下内容添加到类别,产品和付款映射中:

ApplyFilter<DateFilter>();

当我启用过滤器时,我希望生成的SQL查询在Category,Product和Payment表的“WHERE”子句中具有过滤条件,但它只有Category(top元素)的条件。

代码:

using (var session = SessionProvider.OpenSession(ConnectionString))
{
    session.EnableFilter("DateFilter")
        .SetParameter("start", OracleHelper.ToDate(new DateTime(2012, 1, 1)));

    var query = from cat in session.Query<Category>() select cat;     
    query = query.FetchMany(c => c.Products).ThenFetch(c=>c.Payments);     
    var result = query.Distinct().ToList();
}

生成的SQL:

SELECT ... FROM   ... WHERE category_.Date >= '2012-01-01'

我的期望是:

SELECT ... FROM   ... WHERE category_.Date >= '2012-01-01' 
    and product_.Date >= '2012-01-01'
    and payment_.Date >= '2012-01-01'

我也尝试在这样的映射中应用过滤器:

HasMany<Payment>(x => x.Payments).ApplyFilter<DateFilter>();

但它在连接上应用过滤器(将过滤条件放在连接的ON子句中)不在“WHERE”子句中,这使用左外连接给出了错误的结果。

过滤器仅适用于顶级实体,而不适用于渴望获取的子实体吗?

我怎样才能达到我想做的目的?

谢谢!

0 个答案:

没有答案