Nhibernate查询过滤基于子集合的计数

时间:2015-04-29 12:31:40

标签: sql nhibernate queryover nhibernate-projections

最终我想过滤少于2个孩子的所有父对象。

我正在构建一个带有网格仪表板的搜索屏幕,该网格仪表板使用以下逻辑作为如何构建查询的示例。

var query = Session.QueryOver<Parent>(() => parentAlias);

if (!string.IsNullOrWhiteSpace(SearchCriteria.OpenedBy))
    query.Where(Restrictions.Eq(Projections.Property<Parent>(x => x.OpenedBy), SearchCriteria.OpenedBy));

if (SearchCriteria.OpenedDateStart != null)
    query.Where(Restrictions.Ge(Projections.Property<Parent>(x => x.OpenedAt), SearchCriteria.OpenedDateStart));

到目前为止,这一点非常有效:

if (!string.IsNullOrEmpty(SearchCriteria.ChildrenAffected) && SearchCriteria.ChildrenAffected == "Multi")
    query.Where(() => parentAlias.Children.Count > 2);

.Count不起作用是有意义的,这不是真正的linq。另外.Count()会抛出错误。老实说,我觉得我已经尝试过我能想到的Restritions,JoinAlias等的每一个组合,但是我已经走了很久以前的教育尝试的道路并进入了疯狂猜测的境界。

如何根据QueryOver语法中的子项数设置查询以过滤父项?

-----注意----- 我在id获取列表后使用linq进行了辩论,但是我在查询设置中进行了分页,因此在页面返回后将应用过滤器。

1 个答案:

答案 0 :(得分:2)

你需要一个子查询......

Children childrenAlias = null;
var subquery = QueryOver.Of<Children>(() => childrenAlias)
     .Where(() => childrenAlias.Parent.ID == parentAlias.ID)
     .ToRowCountQuery();
query.WithSubquery.WhereValue(2).Le(subquery);

请注意,我不知道如何处理Count > 2,所以我正在做2 <= Count,而且有可能代替

.Where(() => childrenAlias.Parent.ID == parentAlias.ID)

你可以写

.Where(() => childrenAlias.Parent == parentAlias)
嗯......如果你真的需要Count&gt; 2你应该能够:

query.Where(Restrictions.Gt(Projections.SubQuery(subquery), 2));

query.WithSubquery.Where(() => subquery.As<int>() > 4);

(这个我从未使用过......取自http://blog.andrewawhitaker.com/blog/2014/10/24/queryover-series-part-8-working-with-subqueries/