【问题标题】:How to unset a property on a Delta object如何取消设置 Delta 对象的属性
【发布时间】:2018-05-14 21:54:46
【问题描述】:

我正在使用 Azure 移动应用服务,并且在 PATCH 方法中,我收到一个 Delta 类型的对象作为主体(请参阅MSDN)。

我收到一些包含空值的字段,我想从 Delta 输入对象中删除这些字段:我该如何执行此操作?

例如我有一个 JSON 输入,例如

{
    "Content":"test",
    "CreatedAt":null
    ...
}

这映射了一个继承自 Microsoft.Azure.Mobile.Server.EntityData 的实体 例如

public class MyBean : EntityData
{
    public MyBean() { }
    public string Content { get; set; }
}

我想删除字段“CreatedAt”,顺便说一下,它在 EntityData 父对象中声明,它是 Microsoft 库的一部分(因此我无法直接访问它)。

【问题讨论】:

  • 您输入的类型是什么?它是一个字符串吗?一些反序列化的对象?
  • 感谢@EvanTrimboli,我刚刚编辑了问题以使其更清晰

标签: c# odata azure-mobile-services delta


【解决方案1】:

我认为您不应该尝试删除 CreatedAt,而是获取传入的 Delta 并创建一个新的。您可以包含您想要的字段,也可以排除您不想要的字段。

var newDelta = new Delta<MyBean>();
foreach(var fieldName in patchDelta.GetChangedPropertyNames()){
  if(fieldName != "CreatedAt"){
    if(patchDelta.TryGetPropertyValue(fieldName, out object fieldValue)){
      newDelta.TrySetPropertyValue(fieldNAme,fieldValue);
    }
   }
}

【讨论】:

  • 我喜欢这种方法,你对性能有什么线索吗?我有或多或少有 20 个字段的 bean,其中通常有 5 个是不可变的(这意味着我想从 Delta 中删除)。
  • 我不熟悉 Delta 类以及作为 Azure 移动应用服务一部分的任何开销,但我希望性能问题可以忽略不计。这是一些更多的堆分配,但工作将是请求中所有其他事情的一小部分,如授权、反序列化等。如果您不确定类型的方式是 TryGets并且 TrySet 偶尔会失败,您可能会遇到一些性能问题,但由于这些是具有已知字段名称的已知类型,因此它们永远不应返回 false,并且应该正常运行。
【解决方案2】:

如果您使用 Newtonsoft.Json 来序列化实体,那么您可以使用属性的conditional serialization

要有条件地序列化一个属性,添加一个返回的方法 与属性同名的布尔值,然后为方法添加前缀 名称与 ShouldSerialize。方法的结果决定是否 该属性已序列化。如果该方法返回 true,则 属性将被序列化,如果它返回 false 则该属性 将被跳过。

public class MyBean : EntityData
{
    public MyBean() { }
    public string Content { get; set; }

    public bool ShouldSerializeCreatedAt()
    {        
        return false;
        // Or you can add some condition to whether serialize the property or not on runtime 
    }
}

【讨论】:

  • 感谢@Vinit,这令人鼓舞,但我对这种方法有一些问题:首先我需要在 DE 序列化中添加 biz 逻辑,而不是在序列化中;其次,我如何在方法中应用一些业务逻辑,例如允许对 POST 方法而不是 PATCH 方法进行反序列化;第三,我的问题更多是关于Delta对象的管理,而不是JSON按摩。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 2014-05-02
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多