2

我有以下数据模型:

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 的过滤器,并将以下内容添加到 Category、Product 和 Payment 映射中:

ApplyFilter<DateFilter>();

当我启用过滤器时,我预计生成的 SQL 查询将在类别、产品和付款表的“WHERE”子句中具有过滤条件,但它只有类别(顶部元素)的条件。

代码:

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”子句中,这会使用左外连接给出错误的结果。

过滤器是否仅适用于顶级实体而不适用于急切获取的子实体?

我还能如何实现我想做的事情?

谢谢!

4

0 回答 0