在果园HQL查询中用OR子句组合两个表中的两个条件
本文关键字:两个 条件 组合 HQL 果园 查询 子句 OR | 更新日期: 2023-09-27 18:17:58
在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();
但是我不能使它工作。有人有什么建议吗?
当你在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')"));