Как аннотировать DTO, чтобы включить отображение без учета регистра? - PullRequest
0 голосов
/ 07 декабря 2018

Как мне прочитать данные в конкретную модель, не зная регистр имен столбцов источника?

Я читаю данные из табличного хранилища:

public static IEnumerable<Translation> GetTranslations(string sourceParty, string destinationParty)
{
    var acc = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("RRRCacheStorageConnection"));
    var tableClient = acc.CreateCloudTableClient();
    var table = tableClient.GetTableReference(Environment.GetEnvironmentVariable("RRRTableCache"));

    TableQuery<Translation> rangeQuery = new TableQuery<Translation>().Where(
        TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition(Environment.GetEnvironmentVariable("SourcePartyColumnName"), QueryComparisons.Equal, sourceParty),
            TableOperators.And,
            TableQuery.GenerateFilterCondition(Environment.GetEnvironmentVariable("DestinationPartyColumnName"), QueryComparisons.Equal, destinationParty)));

    return table.ExecuteQuery(rangeQuery);
}

Затем я добавляю в конкретную модель, которая выглядит следующим образом:

public class Translation : TableEntity
{
    public Translation()
    {

    }
    public string translatefrom { get; set; }
    public string translateto { get; set; }
    public string TranslationId { get; set; }
    public string FieldType { get; set; }
    public string sourceparty { get; set; }
    public string destinationparty { get; set; }
}

Однако, если исходная таблица в Azure имеет поле с именем TranslateFrom, а не translatefrom (как определено в классе выше),тогда данные не читаются.

Как мне прочитать данные в конкретную модель, не зная регистр имен столбцов источника?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы должны следовать соглашениям UpperCamelCase в C # и lowerCamelCase для JSON / JS

Так что смешивать соглашения, такие как у вас, - плохая идея, и она просто вызовет проблемы с библиотеками, такими как Entity, вызовет проблемыдля других пользователей на стороне удобочитаемости и после того, как вы начнете делать вызовы API, это полностью сбивает с толку.

Обновите вашу табличную сущность, чтобы использовать все UpperCamelCase.То же самое относится и к DTO, потому что JSON Convert автоматически применяет lowerCamelCase во время сериализации и десериализации для JavaScript, сохраняя ваш код в C # Convention.

Существует возможность сказать Entity игнорировать регистр ... но я, скорее, предоставлю вам внешнее мнение, чтобы НЕ изменять соглашения, которые были приняты умными людьми ... а лучше исправить ваш подход купростите жизнь для каждого.

Предполагая, что это стандартный способ написания C # (UpperCase)

public class TestClass {
   public string TranslateFrom { get; set; }
}

, и вы возвращаете его через ActionResult в MVC или API

public ActionResult SomeActionMethod() {
  return Json(new TestClass(){TranslateFrom="z-axis"});
}

JSON (соглашение об именовании свойств) будет lowerCase

{ "translateFrom" : "z-axis" }

и наоборот.Вы можете отправить заглавные или строчные буквы в C # MVC / API, и Newtonsoft.JSON сработает.Но вы должны придерживаться соглашения JavaScript всегда нижестоящих свойств.

Ваш класс должен выглядеть следующим образом.

public class Translation : TableEntity
{
    public string TranslateFrom { get; set; }
    public string TranslateTo { get; set; }
    public string TranslationId { get; set; }
    public string FieldType { get; set; }
    public string SourceParty { get; set; }
    public string DestinationParty { get; set; }
}
...