我有以下数据模型:
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”子句中,这会使用左外连接给出错误的结果。
过滤器是否仅适用于顶级实体而不适用于急切获取的子实体?
我还能如何实现我想做的事情?
谢谢!