gpt4 book ai didi

c# - Elasticsearch(C# 嵌套) : Map abstract property

转载 作者:行者123 更新时间:2023-12-03 01:35:18 25 4
gpt4 key购买 nike

我在 C# 中有一个 ProductDiscount 类。其他类继承自它(FlatDiscount、PercentageDiscount 等)。

在 Elastic 中存储数据似乎可行,但我无法从 Elastic 中读取数据。

我收到此错误:
无法创建 ProductDiscount 类型的实例。类型是接口(interface)或抽象类,不能实例化。路径“discount.amount”,第 1 行,位置 1098。

当我查看我的索引时,折扣确实存储在集合中,但没有指示类的类型。

是否可以将 c# 中的抽象属性与嵌套客户端映射?

我试过这个映射描述符但没有成功:

mappingsDescriptor.Map<Product>(x => x
.Properties(props => props

.Object<ProductDiscount>(o => o.Name(prop => prop.Discount))
.Object<FlatProductDiscount>(o => o.Name(prop => prop.Discount).AutoMap())
.Object<PercentageProductDiscount>(o => o.Name(prop => prop.Discount).AutoMap())
.Object<FreeProductProductDiscount>(o => o.Name(prop => prop.Discount).AutoMap())
.Object<QuantityProductDiscount>(o => o.Name(prop => prop.Discount).AutoMap())
)
);

使用 ElasticClient 完成读取:
    var result = await ElasticClient.SearchAsync<Product>(new SearchRequest(Indices.Index(index: CollectionName)));

最佳答案

我找到了解决办法!!

我使用 JsonSubTypes package 编写了一个自定义转换器.

    private static JsonConverter DiscountConverter()
{
var assembly = Assembly.GetAssembly(typeof(ProductDiscount));

var builder = JsonSubtypesConverterBuilder
.Of(typeof(ProductDiscount), "Type");

assembly
.GetTypes()
.Where(type => type.IsSubclassOf(typeof(ProductDiscount)) && !type.IsAbstract)
.ForEach(s =>
{
builder.RegisterSubtype(s, s.Name);
});

var converter = builder
.SerializeDiscriminatorProperty()
.Build();

return converter;
}

我的连接是这样设置的
            var pool = new SingleNodeConnectionPool(new Uri(uris.First()));
connectionSettings = new ConnectionSettings(pool, connection, SourceSerializer());

private static ConnectionSettings.SourceSerializerFactory SourceSerializer()
{
return (builtin, settings) => new JsonNetSerializer(builtin, settings,
() => new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new StringEnumConverter(),
DiscountConverter()
}
});
}

关于c# - Elasticsearch(C# 嵌套) : Map abstract property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53049233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com