在果园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();

但是我不能使它工作。有人有什么建议吗?

在果园HQL查询中用OR子句组合两个表中的两个条件

当你在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')"));