在.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;。
答案 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有点复杂,因为您需要在保存记录时手动更新它,但可以用来实现一些乐观的并发保护。