Orchard CMS HQL查询分类:OR在WHERE条件下

时间:2018-04-30 10:53:06

标签: orchardcms taxonomy

我试图通过检查用户和页面之间的常用术语来过滤用户看到的页面。用户和页面都具有相同类型的分类字段("类别"),条款"标准"和" Premium"。

如果用户的类别与页面的类别匹配,我想显示它,否则不要。这适用于PagePart上的以下IHqlQuery:

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

其中id是用户的术语ID列表。

除了上述标准外,我还希望显示没有附加条款的页面。这可以通过以下方式正常工作:

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")));

这里,第一个条件是错误的,因为我无法使用&#34; Terms.TermRecord&#34;访问条款列表中的元素。就我的Hql功能而言。你有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我担心我不是那么熟悉的Orchard的查询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)