Orchard CMS HQL Таксономии запросов: ИЛИ в состоянии ГДЕ - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь отфильтровать страницы, которые видит пользователь, проверяя общие термины между пользователем и страницей. И пользователь, и страница имеют поле таксономии одного типа («Категория») с терминами «Стандартный» и «Премиум».

Если категория пользователя совпадает с категорией страницы, я хочу отобразить ее, в противном случае - нет. Это прекрасно работает со следующим IHqlQuery на PagePart:

context.Query.Where(a => a.ContentPartRecord<TermsPartRecord>()
             .Property("Terms", "terms"), 
               x => x.InG("TermRecord.Id", ids));

где ids - список идентификаторов терминов пользователя.

Помимо указанных выше критериев, я также хочу отображать страницы, к которым не добавлены термины. Это прекрасно работает само по себе:

context.Query.Where(a => a.ContentPartRecord<TermsPartRecord>(),
            x => x.IsEmpty("Terms")

Проблема в том, что я пытаюсь объединить два вышеуказанных условия. Я пробовал:

context.Query.Where(a => a.ContentPartRecord<TermsPartRecord>()
             .Property("Terms", "terms"), 
               p => p.Or(x => x.InG("TermRecord.Id", ids), y => y.IsEmpty("Terms")));

Второе условие в операторе Or не работает, поскольку запрос уже находится в коллекции терминов.

Я также пробовал:

context.Query.Where(a => a.ContentPartRecord<TermsPartRecord>()              
                p => p.Or(x => x.InG("Terms.TermRecord.Id", ids), y => y.IsEmpty("Terms")));

Здесь первое условие неверно, поскольку я не могу получить доступ к элементу списка Условий с помощью "Terms.TermRecord". Это насколько мои возможности Hql идут. У вас есть какие-нибудь предложения? Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2018

Боюсь, я не такой знакомый API-интерфейс запросов Орчарда, мне всегда было сложно использовать его для более сложных запросов. Вы всегда можете использовать сырой HQL.

select distinct civ.Id
from Orchard.ContentManagement.Records.ContentItemVersionRecord civ
join civ.ContentItemRecord ci
join ci.ContentType ct
left outer join ci.TermsPartRecord tpr
left outer join tpr.Terms terms
where ct.Name = 'Page' AND (terms.TermRecord.Id in (:ids) OR size(tpr.Terms) = 0)
...