DocumentClient.CreateDocumentQuery 在 运行 查询时抛出 "not an instance" 错误

DocumentClient.CreateDocumentQuery throws a "not an instance" error when running a query

我正在编写一个从 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 声明:

Object not set to an instance of an object.

另外一些例外字段是:

Data = {System.Collections.ListDictionaryInternal}

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

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

我使用的客户端属性是:

ConnectionMode = Gateway 和 Protocol = Https.

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

所以我解决了。

在创建 collection 时,我尝试在问题中查询,我注意到分区键是必需的。我在宇宙中的所有其他 collection 都没有。所以我认为某些设置对于确实具有分区键的 collection 应该有所不同。

抛出空异常的部分正在枚举文档查询。根据文档,函数使用看起来没问题,所以我认为问题出在 CreateDocumentQuery。这是因为它创建了一个 "faulty" object,其中包含一些空字段,这可能是由于 collection 分区键发生了变化。

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