【问题标题】:how to annotate DTO to enable case-insensitive mapping?如何注释 DTO 以启用不区分大小写的映射?
【发布时间】:2018-12-07 15:22:58
【问题描述】:

如何在不知道源列名大小写的情况下将数据读入具体模型?

我正在从表存储中读取数据:

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(如上述类中所定义),则不会读取数据。

如何在不知道源列名大小写的情况下将数据读入具体模型?

【问题讨论】:

  • 这个绝对可以;但是我对表格存储不是很熟悉。当我 .AddSignalR (AzureSignalR) 我在启动时执行此操作以绕过它 - 所以它可以完成.. 你需要等待有表存储经验的人来回答,但如果这没有不要指向它: .AddAzureSignalR(signalRConnString) .AddJsonProtocol(options => { options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver(); });

标签: c# .net azure visual-studio-2017 azure-table-storage


【解决方案1】:

您应该遵循 C# 中的 UpperCamelCase 和 JSON/JS 中的 lowerCamelCase 的约定

因此,像你这样混合约定是个坏主意,只会导致像 Entity 这样的库出现问题,在可读性方面给其他用户带来问题,并且一旦你开始进行 API 调用,就会变得完全混乱。

更新您的表实体以使用所有UpperCamelCase。这同样适用于 DTO,因为 JSON Convert 将在 JavaScript 的序列化和反序列化期间自动应用 lowerCamelCase,同时保持您的代码符合 C# 约定。

有一个选项可以告诉 Entity 忽略大小写...但我宁愿为您提供外部意见,不要更改聪明人制定的约定...而是改正您的方法以使生活更轻松为下线的每个人。

假设这种标准的 C# 编写方式(大写)

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

然后你通过 MVC 或 API 中的 ActionResult 返回它

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

JSON(属性命名约定)将是小写

{ "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; }
}

【讨论】:

  • 有一个选项可以告诉 Entity 忽略大小写 -- 我们如何做到这一点?
  • JSON Convert 将在 JavaScript 的序列化和反序列化期间自动应用 lowerCamelCase,同时保持您的代码符合 C# 约定。 - 你是说 JSON 有一个内置引擎,可以任何大小写字符串并将其转换为驼峰式?
  • Newtonsoft.JSON 将这些约定用于 Javascript 目的。如果你的 DTO 是 UpperCamelCase,那么序列化出来的就是 lowerCamelCase 以符合说 TypeScript Linting! JSON 是一种 WebStandard,他们总是使用 lowerCamelCase,而 C# 是 C#,它始终是 UpperCamelCase
  • 我不会告诉你如何改变约定。因为我试图告诉你不要这样做。你只会让事情变得更糟
  • 漂亮。所以您建议我将表列名称(存储在表 api 中)更新为驼峰式,对吗?这样,当我们反序列化为 c# 类时,它会自动将 camelCase 映射到 CamelCase
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2019-10-04
  • 2017-07-19
  • 2011-02-18
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多