【问题标题】:NEST won't allow me to add a func parameterNEST 不允许我添加 func 参数
【发布时间】:2020-08-25 12:14:09
【问题描述】:

好的,我有一个奇怪的问题,我不确定是否只是因为它们是 func 并且 func 对我来说很新(func 的整个想法让我有点恼火)。

我需要两次调用完全相同的查询,因为我需要 2 个图形/数据集。每个参数一个。因为我不想重复我的查询,所以我在我的类中添加了一个 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,这绝对是错误的。就像 NEST 的内部部分对存在的任何参数执行某种 .ToString(),这就是为什么它返回 field 而不是我在函数中输入的内容。

知道这是否应该是这样的吗?我的 JSON 中的 aggs 也对应于 .Aggregations(aggs =&gt; aggs lambda 命名。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    啊,正如我所说,我是 funcs 和 Expression 的新手,事实证明这正是我所需要的。它实际上并不评估函数 - 我需要给它一个表达式。

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

    然后给它表达式:

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

    然后它评估它并完美运行。

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多