![](/style/images/good.png)
![](/style/images/bad.png)
Elasticsearch.Nest 教程系列 10-4 常用类型:Union Type | 类型合并
source link: https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Union-Type.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Elasticsearch.Nest 教程系列 10-4 常用类型:Union Type | 类型合并
create: 2020-01-23 13:02:01 | update: 2020-01-23 12:15:44
本文总阅读量: 38 次
|
文章总字数: 486 字
|
阅读约需: 2 分钟
- 本系列博文是“伪”官方文档翻译(更加本土化),并非完全将官方文档进行翻译,而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方,还请海涵、不吝拍砖 :)
- 官方文档见此:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html
- 本系列对应的版本环境:[email protected],[email protected],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> 的实例:
Union<bool, ISourceFilter> sourceFilterFalse = false;
Union<bool, ISourceFilter> sourceFilterInterface = new SourceFilter
{
Includes = new [] { "foo.*" }
};
通过构造函数
var sourceFilterTrue = new Union<bool, ISourceFilter>(true);
var sourceFilterInterface = new Union<bool, ISourceFilter>(new SourceFilter
{
Includes = new [] { "foo.*" }
});
- 当编译器不支持的时候,就需要使用通过构造函数的方式来声明了。
Match
可以通过委托的方式,对 TFirst 和 TSecond 进行运算比对:
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());
同样,委托也可以返回一个值:
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.*\"]}");
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK