我试图通过检查用户和页面之间的常用术语来过滤用户看到的页面。用户和页面都具有相同类型的分类字段("类别"),条款"标准"和" 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功能而言。你有什么建议吗?提前谢谢。
答案 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)