我正在尝试使用 NHibernate 构建一个搜索查询,该查询将过滤来自几个不同表的参数,并产生可以利用 NHibernate 延迟加载的稍微合理的 SQL。Fromm 在线阅读各种提示,似乎最新最好的方法是使用 QueryOver 对象有条件地添加正在使用的参数,如以下代码段所示:
Hibernate.Criterion.QueryOver<Models.Site, Models.Site> query = NHibernate.Criterion.QueryOver.Of<Models.Site>();
if (!string.IsNullOrEmpty(state))
query = query.WhereRestrictionOn(r => r.State.StateName).IsInsensitiveLike("%" + state + "%");
if (startDate.HasValue)
query = query.Where(r => r.Events
.Where(e=>e.EventDate >= startDate.Value)
.Count() > 0
);
return query.GetExecutableQueryOver(currentSession).Cacheable().List();
(一个事件有一个外键到站点)
我有两个问题:如何过滤子对象,而不仅仅是父对象?上面的示例代码为我提供了具有匹配事件的所有站点,但在该站点中,我只想要匹配事件。如果我应该使用联接或子查询,如何?我对通过连接或子查询进行延迟加载来维护我的树状层次结构感到困惑。
编辑:这已经回答了。谢谢普苏萨!
如何添加 or 子句?我找到了对 Disjunction 对象的引用,但使用 QueryOver 方法似乎无法获得该引用。
编辑:我想生成一个按站点条件过滤的站点列表(顶级对象),并且每个站点都应该有按事件条件过滤的事件列表。
我希望它生成如下 SQL:
SELECT *
FROM [site] s
LEFT JOIN [event] e ON s.siteID = e.siteID
WHERE e.eventDate > @eventDate
AND (s.stateCd = @state OR s.stateName LIKE @state)