nest不允许我添加func参数

nafvub8i  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(406)

好吧,我有一个奇怪的问题,我不确定这是否仅仅是因为它们是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命名。

9udxz4iz

9udxz4iz1#

啊,就像我说的,我对funcs很陌生,而且 Expression ,这正是我需要的。它实际上并没有计算函数-我需要给它一个表达式。

SearchDescriptor<Stats> Query(SearchDescriptor<Stats> qc, Expression<Func<Stats, double>> field)
{
    ......
}

然后给它一个表达式:

.Average("3", f => f
    .Field(field)
)

然后对其进行评估并完美地工作。

相关问题