我有一个名为selected
的对象列表,它是这样的形状:List<{bool Selected, String Discriminator, List<int> Tags}>
。
如果document.VgnItm.Discriminator
是selected[index].Discriminator
中的一个,并且document.VgnItm.Tags
至少有一个来自selected[index].Tags
的标记,则选择该文档。
当selected
只包含一个项目时,此方法有效:
for (var i = 0; i < selected.Count; i++)
{
QueryContainer &= Query<VgnItmEstSearchDto>.Bool(boolean => boolean.Must(booleanMust =>
booleanMust.Term(term => term.Field(termField => termField.VgnItm.Discriminator)
.Value(selected[i].Discriminator)),
booleanMust => booleanMust.Terms(terms => terms
.Field(p => p.VgnItm.Tags)
.Terms(selected[i].Tags)
))
);
}
但是当selected
包含两个或更多的项目时,QueryContainer &=
意味着document.VgnItm.Discriminator
必须是selected[index1].Discriminator
,也是selected[index2].Discriminator
,这是不可能的。所以它找不到任何结果。
当选定的内容包含多个项目时,我可以在此处执行哪些操作以使此功能正常工作?我不能只使用QueryContainer |=
,因为QueryContainer
上面还有其他子句。我尝试将Query<VgnItmEstSearchDto>.Bool(boolean => boolean.Must
Package 在Bool.Should
中,因此它是一个双布尔值,但结果相同。
1条答案
按热度按时间hjzp0vay1#
我能够通过以正确的方式组合
QueryContainer
来做到这一点。只要我们这样作曲:var compositeQueryContainer = childQueryA.QueryContainer &= childQueryB.QueryContainer
,然后有QueryContainer |= Query<VgnItmEstSearchDto>.Bool
,就像我在我的问题中提到的,不会否定以前的查询,它会合并它们(与它们而不是或它们)。因此,我可以按照问题中的方式创建自定义查询,但在循环中使用
|=
(OR),这会在每个循环周期中构建一个更大的查询容器:然后使用
&=
将其与父查询中的另一个子查询组合:然后可以像这样使用: