2017-04-07 74 views
0

我在C#中使用elasticsearch将一些数据放入elasticsearch。我保持我的C#类&属性根据数据库(PascalCase)。但是,我的要求是将所有属性转换为大写,并将少数名称更改为另一个名称。类名也应该是可能的。我怎样才能将类属性转换为大写,并重新命名与elasticsearch中的属性使用c#

我不想通过数据注释来实现这一点。有没有什么办法可以使所有C#类通用?

我使用的是NEST 5.X版本。

例如,

class Foo 
{ 
    public string thisMessage {get; set; } 
    public string anotherMessage {get; set; } 
} 

应该转换成

class FOOABC 
{ 
    public string THISMESSAGE {get; set; } 
    public string ANOTHER {get; set; } 
} 
+0

你是否也想更改旧文件? – RoiHatam

+0

目前还不清楚你在问什么;你想改变类型的源代码,还是想控制它们如何序列化为json,以控制C#POCO中每个属性的_type和field属性? –

+0

我只想重命名属性,并在索引到elasticsearch之前将它们更改为大写。 –

回答

0

有可能与NEST两者都做,而无需使用属性:

  1. 改变POCO的属性名称外壳当序列化并发送给Elasticsearch时,请使用DefaultFieldNameInferrer(Func<string, string>)

  2. 改变类型的名称和重命名属性,使用InferMappingFor<T>()TypeName()Rename()

下面是一个例子

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var defaultIndex = "default-index"; 
    var connectionSettings = new ConnectionSettings(pool) 
     .DefaultFieldNameInferrer(s => s.ToUpperInvariant()) 
     .InferMappingFor<Foo>(m => m 
      .TypeName("FOOABC") 
      .Rename(p => p.anotherMessage, "ANOTHER") 
     ) 
     .DefaultIndex(defaultIndex); 

    var client = new ElasticClient(connectionSettings); 

    if (client.IndexExists(defaultIndex).Exists) 
     client.DeleteIndex(defaultIndex); 

    var indexResponse = client.Index(new Foo 
    { 
     thisMessage = "this message", 
     anotherMessage = "another message" 
    }); 
} 

class Foo 
{ 
    public string thisMessage { get; set; } 
    public string anotherMessage { get; set; } 
} 

索引请求和响应

POST http://localhost:9200/default-index/FOOABC?pretty=true 
{ 
    "THISMESSAGE": "this message", 
    "ANOTHER": "another message" 
} 

Status: 201 
{ 
    "_index" : "default-index", 
    "_type" : "FOOABC", 
    "_id" : "AVtaHKDcii5CLKx9KIcZ", 
    "_version" : 1, 
    "result" : "created", 
    "_shards" : { 
    "total" : 2, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "created" : true 
} 
相关问题