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


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