I had written the following code in a project
...
return s && s.value || null
It works well for some days until a colleague did some code refactoring. In the beginning, s.value is a string value, and an empty string is not a valid value, so the code works well. After the refactoring, s.value became an integer, and this time 0
is a valid value. So you can imagine when s.value === 0
the code above will return null instead of 0. It leads to a bug!
Therefore please use the"A || B
" expression with caution!
Two articles explain well this subject. One is in Chinese, the other is in English.
- Present enums as string. Modify your
StartUp.cs
, add the highlight part below:
services.AddMemoryCache().AddMvcCore().AddJsonOptions(opts =>
{
opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
})
.AddDataAnnotationsLocalization();
-
Enable XML Comments
- Manually add the two lines in PropertyGroup below to the .csproj file:
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>
2. Add the options in the code below
services.AddSwaggerGen(options =>
{
options.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{AppDomain.CurrentDomain.FriendlyName}.xml"), true);
});
await Db.Queryable<Entity>().Where(_ => _.SampleFieldName== sampleFieldValue)
.GroupBy("AnothterFieldNameInStringFormat")
.Select<ResultModel>("AnotherFieldNameInStringFormat, Count(AnotherFieldNameInStringFormat) Total")
.ToListAsync();
这与 Nest 默认的字段名映射规则有关。C# 项目字段名往往是 CamelCase,然而 Nest API在创建索引时,默认会将 CamelCase 的字段名,转换为 camelCase 的字段名。当然,查询的时候,它也会精确的按照 camelCase 字段名映射数据。如果你只用 Nest,其实是不会有任何问题的。毕竟 AutoMapper 对字段名大小写是很宽容的。
当我们引入 Logstash 动态更新索引之后,不和谐的一幕出现了。凡是 Logstash 更新的过数据,查询的时候会返回搜索结果,但所有字段的值都是null。这是因为Logstash在更新索引的时候,没有做 CamelCase => camelCase 的字段名转换。
了解了问题产生的原因,解决起来也就容易了。幸运的是,Nest有一个配置参数,可以设置为索引时不做字段名转换。直接上代码
public static void AddElasticsearch(
this IServiceCollection services, string connectionUrl, string connectionIndex)
{
var defaultIndex = connectionIndex;
var settings = new ConnectionSettings(new Uri(connectionUrl))
.DefaultIndex(defaultIndex);
settings.DefaultFieldNameInferrer(p => p);
var client = new ElasticClient(settings);
services.AddSingleton(client);
}
需要注意的是,代码修改后,别忘记重建索引。否则你会发现原来不正常的( Logstash更新过的数据)都正常了,原来搜索正常的,现在却所有字段名都变成了null。