我的问题很简单,我想动态创建过滤器以在我的查询输入中使用它。 我必须确定 tf 变量不能改变。
这就是我所做的:
totalFilter := expression.ConditionBuilder{}
filter := expression.Name("status").Equal(expression.Value("0"))
filter2 := expression.Name("foo").Equal(expression.Value("bar"))
filter3 := expression.Name("yes").Equal(expression.Value("no"))
tf := []expression.ConditionBuilder{filter, filter2, filter3}
for _, v := range tf {
totalFilter = totalFilter.And(v)
}
expr := expression.NewBuilder().WithFilter(totalFilter)
builder, err := expr.Build()
if err != nil {
log.Println(err)
return err
}
但问题是 totalFilter 是一个空结构体,所以它的模式变量等于 0,然后它引发警报,因为模式 0 是 unsetCond。
我发现的唯一解决方法是这样做:
for i, v := range tf {
if i == 0 {
totalFilter = v
} else {
totalFilter.And(v)
}
}
但我想知道是否还有其他解决方案。
答案 0 :(得分:1)
您可以抽象出使用至少一个 expression.ConditionBuilder
参数的自定义可变参数函数中第一个 expression.ConditionBuilder
的处理:
func And(first expression.ConditionBuilder, rest ...expression.ConditionBuilder) expression.ConditionBuilder {
result := first
for _, cb := range rest {
result = result.And(cb)
}
return result
}
然后,在 main
中:
filter := expression.Name("status").Equal(expression.Value("0"))
filter2 := expression.Name("foo").Equal(expression.Value("bar"))
filter3 := expression.Name("yes").Equal(expression.Value("no"))
totalFilter := And(filter, filter2, filter3)
expr := expression.NewBuilder().WithFilter(totalFilter)
builder, err := expr.Build()
// etc.
请注意,similar function,也称为 And
,由 expression
包导出,但它至少需要两个(不仅仅是一个)expression.ConditionBuilder
参数。真可惜……