在Orchard HQL查询中将两个表中的两个条件与OR子句组合在一起

时间:2014-08-13 09:16:21

标签: c# asp.net-mvc hql orchardcms

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

但是我无法让它发挥作用。任何人都有任何建议吗?

1 个答案:

答案 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')"));