gpt4 book ai didi

c# - CreateDocumentQuery 不绑定(bind)到 CLR 对象

转载 作者:行者123 更新时间:2023-11-30 16:06:20 25 4
gpt4 key购买 nike

我有一个解决方案,问题是为什么会发生这种情况以及这是否是一个好的解决方案。背景:在 Azure DocumentDb 中,我有一个托管哈希,它使用一个集合对数据库进行分区。CLR 对象继承自 Document 类。我已将 JsonProperty 属性放在所有属性上。

无效的查询是这个:

var a = _client.CreateDocumentQuery<T>(_database.SelfLink)
.Where(d => d.Id == id)
.AsEnumerable()
.FirstOrDefault();

它总是返回 null(文档就在那里,我在门户中看到它)。我现在已经浪费了很多时间,而我能做的就是:

var a = _client.CreateDocumentQuery<Document>(_database.SelfLink, "SELECT * FROM c")
.AsEnumerable().Where(t => t.Id == id)
.FirstOrDefault();
var obj = JsonConvert.SerializeObject(b);
T parsed = JsonConvert.DeserializeObject<T>(obj);

这不是很糟糕吗?有谁知道为什么框架不为我反序列化它,以及为什么它在第一个示例中找不到任何内容?

更新:

实际上,上面的“解决方案”并没有反序列化所有属性。我有一个属性 Dictionary<Guid,Dictionary<string, string>> 不会反序列化到 CLR 属性中。根据智能感知,该对象属于 CLR 类型,但它具有大量基类信息。但它似乎嵌套在永恒中。无法真正看到类型是什么,但向上 6 级(我认为这是资源基类)我找到一个私有(private) _propertybag,其中所有属性均为 JTokens/JProperties(老实说,我不知道如何分辨它们是哪一个) 。所以,那里有 json 数据,而我需要的数据在实际对象中,它只是没有绑定(bind)到属性。我尝试在 Resource 类上使用 .SetProperty() 方法,这确实有效。但是从 DocumentClient 获取时应该反序列化并绑定(bind),不是吗?我在这里做错了什么?

2个月后:我再次研究了这个问题,结果发现,对于我的代码中的一个地方,上述可怕的解决方法仍然是唯一可以获得我的文档的方法。但原因是要在链条的早期找到。该方法的参数是 Expression<Func<TEntity,bool>> 。我的调用链是

public T CreateIfNotExists<T>(Guid id) where T : IBaseDocument
{
var id = ProduceDocId(typeof(T), id);
var result = _repository.GetSingle<T>(r => r.Id == id);
...
}

然后

public T GetSingle<T>(Expression<Func<T, bool>> predicate) where T : IBaseDocument
{
... // error handling ommitted
T res = _client.CreateDocumentQuery<T>(_database.SelfLink)
.Where(predicate)
.AsEnumerable()
.FirstOrDefault();
return res;
}

参数“predicate”将计算为匿名方法闭包,即在调试器中显示为“c__DisplayClass2”( explanation for name by Eric Lippert )。就像这样:

{s => (Convert(s).Id == value(FooNameSpace.BarClass+<>c__DisplayClass2`1[FooNameSpace.FooClass]).someId)}

documentdb 无法正确评估此值,并且它始终返回 null。如果我采用匿名方法闭包计算得出的实际 id 并传入,则会给出文档。

最佳答案

解决了!非常非常简单的答案,这都是由于我的无知和缺乏正确的研究努力(因为伙计,我已经付出了努力..)。

文档上的属性 setter 不能不可访问,即私有(private)或 protected 是不行的。

就是这样。

2个月后:事实上,事实并非如此。请参阅原始问题的最后部分。

关于c# - CreateDocumentQuery 不绑定(bind)到 CLR 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com