好吧,我有一个奇怪的问题,我不确定这是否仅仅是因为它们是func和func对我来说是相当新的(func的整个概念让我有点恼火)。
我需要调用两次完全相同的查询,因为我需要两个图/数据集。每个参数一个。因为我不想重复我的查询,所以我在类中添加了一个func参数,这样我就可以强类型地在类中选择正确的属性。
SearchDescriptor<Stats> Query(SearchDescriptor<Stats> qc, Func<Stats, double> field)
{
var query = qc
.Aggregations(aggs => aggs
.DateHistogram("histogram", d => d
.Field(f => f.Timestamp)
.FixedInterval("30m")
.MinimumDocumentCount(1)
.Aggregations(childAggs => childAggs
.Average("3", f => f
.Field(fi => field(fi))
)
)
)
)
.Query(q =>
q.Bool(b =>
b.Filter(
f => f.MatchPhrase(mp => mp
.Field(fi => fi.Name)
.Query(name)
),
f => f.DateRange(r => r
.Field(fi => fi.Timestamp)
.GreaterThanOrEquals(DateTime.UtcNow.AddDays(-1))
.LessThanOrEquals(DateTime.UtcNow)
)
)
)
);
return query;
}
var cpu = await GetByScrolling<Stats>(client, qc => Query(qc, fi => fi.CpuPercent));
var memory = await GetByScrolling<Stats>(client, qc => Query(qc, fi => fi.MemoryUsage));
这是可以编译的,应该可以工作,但不幸的是,生成的json结果如下:
"aggs": {
"3": {
"avg": {
"field": "field"
}
}
}
如您所见,值为 field
,这绝对是错误的。就像鸟巢的内部 .ToString()
不管有什么争论,这就是为什么它会回来 field
而不是我在函数中输入的内容。
你知道这是不是应该是这样吗?这个 aggs
在我的json中,也对应于 .Aggregations(aggs => aggs
lambda命名。
1条答案
按热度按时间9udxz4iz1#
啊,就像我说的,我对funcs很陌生,而且
Expression
,这正是我需要的。它实际上并没有计算函数-我需要给它一个表达式。然后给它一个表达式:
然后对其进行评估并完美地工作。