0

我正在编写一个从 cosmosDB 数据库中获取文档的 .NET Web 服务。我在另一个项目中编写了一个函数(应该尽可能通用)来检索文档,以便 WS 使用它。

我正在使用这样的DocumentClients功能CreateDocumentQuery

public static async Task<T1> GetMyDocumentAsync<T1>(eDataBase databaseName, eCollection collectionName, eFields key, string val)
{
    var option = new FeedOptions { EnableCrossPartitionQuery = true };
    Uri uri = UriFactory.CreateDocumentCollectionUri(databaseName.ToString(), collectionName.ToString());
    IQueryable<T1> res = Client.CreateDocumentQuery<T1>(uri, option);
    document = res.AsEnumerable<T1>().FirstOrDefault();
}

这工作正常,返回数据库中的第一个文档。但是将其用法更改为CreateDocumentQuery

IQueryable<T1> res = Client.CreateDocumentQuery<T1>(uri, "SELECT * FROM c",option);

并且包裹在一个 try-catch 块中会引发一个异常,该异常具有以下InnerException状态:

对象未设置为对象的实例。

还有一些异常字段是:

Data = {System.Collections.ListDictionaryInternal}

Error = {{ "code": "BadRequest",
           "message": "\r\nActivityId: SOMEGUID" }}

该查询适用于来自 azure 门户的该集合。

我正在使用的客户端属性是:

ConnectionMode =网关和协议 = Https

关于为什么这种用法有效而另一种使用显式查询字符串的任何想法都不会?我也尝试使用一个SqlQuerySpec对象,结果是一样的。我不想使用该Where()函数,因为我想使用泛型类型。async 关键字是为了将来使用。

4

1 回答 1

0

所以我解决了。

在创建我试图在问题中查询的集合时,我注意到分区键是强制性的。我在宇宙中的所有其他收藏都没有。因此,我认为对于具有分区键的集合,某些设置应该有所不同。

引发空异常的部分是枚举文档查询。根据文档,函数使用看起来不错,所以我认为问题出在CreateDocumentQuery. 那是因为它创建了一个带有一些空字段的“错误”对象,这可能是由于集合分区键的更改。

所以我尝试将我的整个解决方案的包 Microsoft.Azure.DocumentDB 更新到最新的稳定版本(当时是 2.2.0),然后它就可以工作了。

于 2019-02-18T14:15:38.733 回答