Azure DocumentDB,.NET SDK中的CreateDocumentQuery不会返回" id"和" _self"

时间:2016-09-05 12:10:50

标签: .net azure azure-cosmosdb

在.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();

对象返回&#34; lst&#34;没有服务字段(_self,id,_rid)

虽然对象&#34; WishListUserItems&#34;继承自&#34; Document&#34;。 甚至试图将属性添加到&#34; WishListUserItems&#34;,例如&#34; id&#34;,&#34; _self&#34;。

1 个答案:

答案 0 :(得分: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)

(未经测试)。

更通用的文件

当你只是检索一般的实际文件时,你也可能会感到遗憾的是缺少&#34; id&#34;和&#34; _self&#34;。我们实现了一个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有点复杂,因为您需要在保存记录时手动更新它,但可以用来实现一些乐观的并发保护。