调用源包含,而不手动指定所有属性

本文关键字:属性 包含 调用 | 更新日期: 2023-09-27 18:30:58

我正在使用NEST 1.7来查询Elasticsearch。我在Get操作中使用SourceInclude,因为我只需要返回部分源代码。我有一个DTO类来表示我想从Elasticsearch中获取的属性。但是,我需要手动指定SourceInclude方法的所有属性参数。

这是我正在做的事情的最小重现:

[ElasticType(Name = "productDoc")]
public class Product
{
    [ElasticProperty(Name = "doc_id")]
    public string Id { get; set; }
    [ElasticProperty(Name = "fullname")]
    public string Name { get; set; }
    [ElasticProperty(Name = "desc")]
    public string Description { get; set; }
    // Et cetera...
}
public class SearchRepo
{
    public Product RetrieveProduct(string id)
    {
        IElasticClient client = new ElasticClient();
        var getResponse = client.Get<Product>(p => p
            .Id(id)
            .SourceInclude(
                i => i.Id,
                i => i.Name,
                i => i.Description
                // Et cetera...
            )
        );
        return getResponse.Source;
    }
}

如果 DTO 上有许多属性,这会变得劳动密集型且容易出错。我想以某种方式指定源代码中仅包含我的 DTO 类的属性。

我尝试完全省略SourceInclude调用,希望 NEST 能够从泛型类型参数推断出它需要什么来Get,但检查调试器中的 Elasticsearch 请求似乎告诉我整个文档都被检索了。

标准 NEST 功能是否有任何中间立场?还是我需要滚动自己的方法来动态列出所有 dto 属性?


附言。我在 Github 上问过类似的问题(/功能请求)。

调用源包含,而不手动指定所有属性

不,您需要处理生成字段名称列表以检索自己。如果不提及SourceInclude,则将检索整个_source。这就是 Elasticsearch 的行为。尽管如此,如果字段名称匹配,Nest 将能够从响应中创建Product对象。

相关文章: