0

最终我想过滤所有少于 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() 也会引发错误。老实说,我觉得我已经尝试了所有我能想到的 Restrictions、JoinAlias 等组合,但我很久以前就已经偏离了受过教育的尝试并进入了疯狂猜测的领域。

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

-----注意 ----- 我在 id 得到我的列表后使用 linq 进行了辩论,但我正在查询设置中进行分页,以便在页面返回后应用过滤器。

4

1 回答 1

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 > 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/

于 2015-04-29T12:50:59.927 回答