我有以下数据模型:
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”子句中,这使用左外连接给出了错误的结果。
过滤器仅适用于顶级实体,而不适用于渴望获取的子实体吗?
我怎样才能达到我想做的目的?
谢谢!