0

В конечном итоге я хочу отфильтровать все родительские объекты с числом детей менее 2.Фильтр запросов Nhibernate, основанный на подсчете дочерней коллекции

Я строю экран поиска с панелью управления сеткой, которая использует следующую логику в качестве примера построения запроса.

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 does't работу, это на самом деле не LINQ. Также .Count() выдает ошибку. Честно говоря, я чувствую, что я пробовал каждую комбинацию Restritions, JoinAlias ​​и т. Д., О которых я могу думать, но я ушел с пути образованных попыток и в дикое догадки королевства давным-давно.

Как настроить запрос на фильтрацию родителя на основе количества детей в синтаксисе QueryOver?

----- ПРИМЕЧАНИЕ ----- Я обсуждал использование linq после того, как идентификатор получил мой список, но я выполняю подкачку в запросе, поэтому фильтр будет применяться после возвращения страницы.

ответ

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) 

Мммм ... если нужно графа мя> 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/)

+0

как бы где изменение положение, если это много-к -МНОГИЕ? – Seth

+0

@Seth Вам нужно будет построить соединение через таблицу «многие ко многим» в подзапросе – xanatos

+0

Хорошо, скоро, когда я получу его работу, я сделаю это правильно. Это выглядит правильно. – Seth

Смежные вопросы