在orchard cms中,我想编写一个包含两个不同ContentPartRecord
结合OR
子句的两个条件的查询。结合条件的一种可能方法是:
var query = _contentManager.HqlQuery()
.Where(a => a.ContentPartRecord<ProductPartRecord>(), a => a.Eq("Title", "myTitle"))
.Where(a => a.ContentPartRecord<TitlePartRecord>(), a => a.Eq("Price", 1000))
.List();
但是这个结合了两个条件和And
子句。我认为跟随一些变化(这可能是这个问题的答案)之类的事情可能就是这样:
var query = _contentManager.HqlQuery()
.Join(a => a.ContentPartRecord<ProductPartRecord>())
.Join(a => a.ContentPartRecord<TitlePartRecord>())
.Where(a => a.ContentItem(),
a => a.Or(p => p.Eq("ProductPartRecord.Price",
"1000"), t => t.Eq("TitlePartRecord.Title", "myTitle")))
.List();
但是我无法让它发挥作用。任何人都有任何建议吗?
答案 0 :(得分:2)
在HqlQuery中使用where子句时,需要传递Alias(作为第一个参数)。别名意味着您将where子句应用于特定表(表示此表的类)。当您使用OR子句时,您肯定需要在OR子句的两个部分(OR子句中的左侧和右侧)中比较特定表的列。我认为你不可能需要一种标准的方式。
但你可以使用:
Action<IAliasFactory> productPartRecordAlias = x => x.ContentPartRecord<ProductPartRecord>().Named("productPartRecord");
Action<IAliasFactory> titlePartRecordAlias = x => x.ContentPartRecord<TitlePartRecord>().Named("titlePartRecord");
var query = _contentManager.HqlQuery()
.Join(productPartRecordAlias)
.Join(titlePartRecordAlias)
.Where(a => a.ContentItem(), p => p.Gt("Id", "0 AND (productPartRecord.Price = 1000 OR titlePartRecord.Title = 'myTitle')"));