elasticsearch 无法写入扩展方法以包装嵌套客户端方法,elasticsearch,.net-core,nest,elasticsearch,.net Core,Nest" /> elasticsearch 无法写入扩展方法以包装嵌套客户端方法,elasticsearch,.net-core,nest,elasticsearch,.net Core,Nest" />

elasticsearch 无法写入扩展方法以包装嵌套客户端方法

elasticsearch 无法写入扩展方法以包装嵌套客户端方法,elasticsearch,.net-core,nest,elasticsearch,.net Core,Nest,基本上,我试图编写以下扩展方法,以避免不断编写.Suffixkeyword。我不喜欢到处都是字符串文字,我的ElasticSearch索引的多个属性碰巧需要添加关键字后缀才能正确查询 public static class NestHelperExtensions { public static object UseKeywordSuffix(this object @object) { return @object.Suffix("keyword");

基本上,我试图编写以下扩展方法,以避免不断编写.Suffixkeyword。我不喜欢到处都是字符串文字,我的ElasticSearch索引的多个属性碰巧需要添加关键字后缀才能正确查询

public static class NestHelperExtensions
{
    public static object UseKeywordSuffix(this object @object)
    {
        return @object.Suffix("keyword");
    }
}
如果我使用上面介绍的方法,它不会应用后缀,但我不确定为什么它不起作用。我可能用了错误的方法,也许有一种方法可以添加一个model属性或构建一个nestcillent.Search,但是当我尝试使用关键字属性时,这似乎也不起作用


有人能解释一下为什么不这么简单吗?如果可能的话,你能提供一个示例或解决方法,例如使用属性吗?

这不起作用,因为

如果methodCall.Method.Name==nameofSuffixExtensions.Suffix&&methodCall.Arguments.Any { VisitConstantOrVariablemethodCall,_stack; var callingMember=新的只读集合 新列表{{methodCall.Arguments.First} ; 探访会员; 返回方法调用; } 所以,像上面这样的扩展方法需要调用Suffix才能开始,并且它必须至少有一个参数。您可能会考虑提供一个默认值为keyword的可选参数,但表达式树不支持这一点,因此不起作用

另一种方法是在表达式上使用AppendSuffix扩展方法来构建一些东西;最好的使用方法是将lambda表达式从fluent调用中拉出来并放入变量中

公共静态类NestHelperExtensions { 公共静态表达式关键字后缀此表达式 { 返回表达式.AppendSuffixkeyword; } } var客户端=新的ElasticClient; 表达式firstName=f=>f.firstName; var searchResponse=client.Searchs=>s .Queryq=>q .Matchm=>m .FieldfirstName.KeywordSuffix Querybar先生 ; 不太好的方法是将lambda表达式转换为内联表达式

var searchResponse=client.Searchs=>s .Queryq=>q .Matchm=>m .FieldExpressionf=>f.FirstName.KeywordSuffix Querybar先生 ; 另一种可能更简单的方法是为string关键字引入一个常量,并在后缀扩展方法中使用该常量;它避免了到处使用字符串文字