2017-04-07 71 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 
} 
相關問題