【问题标题】:Azure DocumentDB, CreateDocumentQuery in .NET SDK does not return the "id" and "_self"Azure DocumentDB,.NET SDK 中的 CreateDocumentQuery 不返回“id”和“_self”
【发布时间】:2016-09-05 12:10:49
【问题描述】:

在 .NET 中使用下一个代码时:

var q = DocumentDBHelper.Client.CreateDocumentQuery<WishListUserItems>(DocumentDBHelper.CollUri(eCollection.WishList),
                    "SELECT c.UserId, c.Items FROM c JOIN items IN c.Items);

            var lst = q.ToList();

“lst”中返回的对象没有服务字段(_self、id、_rid)

虽然对象“WishListUserItems”继承自“Document”。 甚至尝试向“WishListUserItems”添加属性,例如“id”、“_self”。

【问题讨论】:

    标签: .net azure azure-cosmosdb


    【解决方案1】:

    问题似乎在于您正在运行自定义 SQL,而不仅仅是检索文档。

    SELECT c.UserId, c.Items FROM c JOIN items IN c.Items
    

    意味着 DocumentDb 不再像这样处理文档,它正在投影数据并仅返回数据集,而不是文档,这意味着 DocumentDb 尝试返回 id 或 _self 没有任何意义。
    返回的数据被反序列化为您要求的任何类型。请注意,由于您使用的是自定义 SQL,因此您不会获取整个文档,因此您不应试图将此实例保存回 DocumentDb。

    也就是说,如果您确实想要获取 id 和 _self 以便稍后检索和更新基础文档,您应该能够将它们包含在您的 SQL 语句中并添加相应的字段在你的模型类上。

    有点像

    SELECT c.UserId, c.id, c._self, c.Items FROM c JOIN items IN c.Items)
    

    (未测试)。

    更一般地用于文档

    当您一般只是检索实际文档时,您可能还会感叹缺少“id”和“_self”。我们实现了一个 DocumentBase 类来帮助解决这个问题,就像这样;

    public abstract class DocumentBase
    {
    
        [JsonProperty(PropertyName = "id")]
        public string Id { get; set; }
    
        [JsonProperty(PropertyName = "_etag")]
        public string ETag { get; set; }
    
        [JsonProperty(PropertyName = "_self")]
        public string SelfIdentifier { get; set; }
    }
    

    ETag 使用起来有点复杂,因为您需要在保存记录时手动更新它,但可以用于实现一些乐观并发保护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多