6

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

 3 years ago
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 分钟


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.*\"]}");

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK