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),然后它就成功了。
我正在编写一个从 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),然后它就成功了。