Orchard Content Manager:如何在不同的零件记录字段之间应用OR运算符

本文关键字:记录 零件 字段 之间 运算符 OR 应用 Manager Content Orchard | 更新日期: 2023-09-27 18:00:39

我需要对来自两个不同部分的字段使用OR运算符来过滤数据:

var result = ContentManager.Query("ContentType")
.Where<PartARecord, PartBRecord>(
  (a, b) => a.FieldA.Contains(searchText) || b.FieldB.Contains(searchText)
).List();

有可能吗?

Orchard Content Manager:如何在不同的零件记录字段之间应用OR运算符

字段将数据库中的故事值设置为Infoset,而不能通过标准sql(IHqlQuery或IContentQuery)进行查询。但如果您启用"投影部分",则字段值也将在单独的表中显示,并且您将能够查询该值。

你可以尝试这样的方法(我不确定它是否有效。可能需要替换Any()或Contains()函数)

var result = ContentManager.Query("ContentType")
    .Where<FieldIndexPartRecord>(p => p.StringFieldIndexRecords.Any(
        f =>
            (f.PropertyName == "ContentType.FieldA." && f.Value.Contains(searchText)) ||
            (f.PropertyName == "ContentType.FieldB." && f.Value.Contains(searchText))
        ))
    .List();

但如果你要使用IHqlQuery,那就做

var result = ContentManager.HqlQuery().ForType(new string[] { "ContentType" })
    .Where(
        a => a.ContentPartRecord<FieldIndexPartRecord>().Property("StringFieldIndexRecords", "fieldAAndB"),
        f => f.Or(
            f1 => f1.And(
                checkName => checkName.Eq("PropertyName", "ContentType.FieldA."),
                checkValue => checkValue.Like("Value", searchText, HqlMatchMode.Anywhere)
            ),
            f2 => f2.And(
                checkName => checkName.Eq("PropertyName", "ContentType.FieldB."),
                checkValue => checkValue.Like("Value", searchText, HqlMatchMode.Anywhere)
            ))
        )
    .List();