gpt4 book ai didi

c# - 在SortFieldDescriptor中使用.Suffix

转载 作者:行者123 更新时间:2023-12-02 22:28:29 25 4
gpt4 key购买 nike

我的ASP.NET Web API具有Search方法,可在Elasticsearch数据库中搜索特定查询。用户还可以设置排序参数(例如属性)以进行排序,或者是否应按升序或降序排序。
http://localhost/api/search?query=jon&sortBy=lastname&sortOrder=desc
Controller 使用NEST将请求传递给Elasticsearch。

var sortProperty = typeof(T).GetProperty(options.SortBy, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);

var sortOrder = options.SortOrder.IndexOf("desc", System.StringComparison.OrdinalIgnoreCase) >= 0
? SortOrder.Descending
: SortOrder.Ascending;

var result = await this.elasticClient.SearchAsync<Person>(search => search
.Query(q => q.MultiMatch(m => m
.Query(query)))
.Sort(sort => sort.Field(sfd => sfd
.Field(new Field(sortProperty))
.Order(sortOrder)));
sortProperty可以是文本字段,例如此示例中的名字和姓氏。为了能够按此文本字段排序,我添加了“raw”关键字字段。

{
"people": {
"mappings": {
"person": {
"properties": {
"birthdate": {
"type": "date"
},
"firstname": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"id": {
"type": "integer"
},
"lastname": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
}

现在,我必须在属性名字和姓氏上添加后缀“raw”。

.Sort(sort => sort.Descending(p => p.Firstname.Suffix("raw")));

但是 如何将其添加到在上面使用的更通用的版本中,其中 sortPropertysortOrder用于创建SortFieldDescriptor?

诸如此类的东西不起作用:

.Sort(sort => sort.Field(sfd => sfd
.Field(new Field(sortProperty).Suffix("raw"))
.Order(sortOrder)));

最佳答案

.Suffix()仅旨在与成员表达式一起使用。

我认为您可以通过使用字符串表示字段来简化此操作。

所以,代替

var sortProperty = typeof(T).GetProperty(options.SortBy, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);

并使用 PropertyInfo创建 Field的实例,您可以使用
var sortOrder = options.SortOrder.IndexOf("desc", System.StringComparison.OrdinalIgnoreCase) >= 0
? SortOrder.Descending
: SortOrder.Ascending;

var result = await this.elasticClient.SearchAsync<Person>(search => search
.Query(q => q
.MultiMatch(m => m
.Query(query)
)
)
.Sort(sort => sort
.Field(sfd => sfd
.Field($"{options.SortBy}.raw")
.Order(sortOrder)
)
);

请注意,从 Field实例化 string时,字符串值是逐字记录的,因此它需要与Elasticsearch中字段的大小写匹配。相反,表达式和 PropertyInfo是根据 .DefaultFieldNameInferrer()上的 ConnectionSettings转换的,默认情况下会是驼峰式的。

stringPropertyInfoExpression<Func<T, object>>隐式转换为 Field实例。看看 Field inference documentation

关于c# - 在SortFieldDescriptor中使用.Suffix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51651403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com