Elasticsearch.Nest 教程系列 10-4 常用类型:Union Type | 类型合并

  • 本系列博文是“伪”官方文档翻译(更加本土化),并非完全将官方文档进行翻译,而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方,还请海涵、不吝拍砖 :)

  • 官方文档见此:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html

  • 本系列对应的版本环境:ElasticSearch@7.3.1,NEST@7.3.1,IDE 和开发平台默认为 VS2019,.NET CORE 2.1


ES 中的某些API参数可以接受多个 JSON 数据结构,例如,搜索请求时对 source 过滤可以接受:

  • bool:可以通过布尔值来禁用 _source 检索。

  • string、string[]:可以使用字符串来设定通配符,以此来控制返回 _source 中的哪些部分。

  • object:一个包含 includs 和 excluds 属性的对象,来分别控制需要在 _source 中需要“包含”和“排除”的部分。

在 NEST 中,可以使用 Union<First,Second> 类型。

隐式转换

Union<TFirst,TSecond>具有隐式运算符,可从 TFirst 或 TSecond 的实例转换为Union<TFirst,TSecond> 的实例:

1
2
3
4
5
6
Union<bool, ISourceFilter> sourceFilterFalse = false;

Union<bool, ISourceFilter> sourceFilterInterface = new SourceFilter
{
Includes = new [] { "foo.*" }
};

通过构造函数

1
2
3
4
5
6
var sourceFilterTrue = new Union<bool, ISourceFilter>(true);

var sourceFilterInterface = new Union<bool, ISourceFilter>(new SourceFilter
{
Includes = new [] { "foo.*" }
});
  • 当编译器不支持的时候,就需要使用通过构造函数的方式来声明了。

Match

可以通过委托的方式,对 TFirst 和 TSecond 进行运算比对:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var sourceFilterTrue = new Union<bool, ISourceFilter>(true);

var sourceFilterInterface = new Union<bool, ISourceFilter>(new SourceFilter
{
Includes = new [] { "foo.*" }
});

sourceFilterTrue.Match(
b => b.Should().BeTrue(),
s => s.Should().BeNull());

sourceFilterInterface.Match(
b => b.Should().BeFalse(),
s => s.Should().NotBeNull());

同样,委托也可以返回一个值:

1
2
3
4
5
6
7
8
9
10
11
var serializedFilterTrue = sourceFilterTrue.Match(
b => serializer.SerializeToString(b),
s => null);

serializedFilterTrue.Should().Be("true");

var serializedFilterInterface = sourceFilterTrue.Match(
b => null,
s => serializer.SerializeToString(s));

serializedFilterInterface.Should().Be("{\"includes\":[\"foo.*\"]}");