【问题标题】:Azure Cosmos DB: 'ToString' is not a recognized built-in function nameAzure Cosmos DB:“ToString”不是可识别的内置函数名称
【发布时间】:2020-09-14 14:48:11
【问题描述】:

当 Azure CosmosDB 的 SQL ToString 系统函数用于使用 Microsoft.Azure.Documents.Client.DocumentClient 客户端从 Cosmos 容器中获取数据时出现错误。 奇怪,但查询在 Azure 门户的“数据资源管理器”选项卡上运行良好。

https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-tostring

Assembly Microsoft.Azure.DocumentDB.Core, Version=1.9.1.0

Project .Net Core 2.2

查询

select ToString(c) FROM c where c.id = 1
select value ToString(c) FROM c where c.id = 1

错误

Microsoft.Azure.Documents.BadRequestException: 'Message: {"errors":[{"severity":"Error","location":{"start":13,"end":21},"code":"SC2005","message":"'ToString' is not a recognized built-in function name."}]}'

更新 1

代码如下

public async Task<IEnumerable<T>> GetItemsAsync<T>(string sqlExpression, string collectionName)
{
    var option = new FeedOptions { EnableCrossPartitionQuery = true, MaxItemCount = 100 };

    IDocumentQuery<T> query = this.client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(databaseName, collectionName), sqlExpression, option)
        .AsDocumentQuery();

    List<T> results = new List<T>();
    while (query.HasMoreResults)
    {
        var items = await query.ExecuteNextAsync<T>();
        results.AddRange(items);
    }

    return results;
}


    string sqlExpression = $"SELECT ToString(C) FROM C WHERE C.id = {id}";
    var jsons = await this.GetItemsAsync<string>(sqlExpression, collectionName);

更新 2

实际 JSON

[
  {
    "id": "79332",
    "pk": "2020081416PM",
    "key": "134869d8-f291-4c96-affe-266d86ae95b8",
    "version": 3,
    "_self": "dbs/ddadfZp5AA==/colls/fZp5AJhvYZY=/docs/fZp5AJhvYZZ6AAAAAAAAAQ==/",
    "_etag": "\"1f00dsd475d-0000-0200-0000-5f5f6edc0000\"",
    "_ts": 1600089820
  }
]

预期结果

[
    "{\"id\":\"79332\",\"pk\":\"2020081416PM\",\"key\":\"134869d8-f291-4c96-affe-266d86ae95b8\",\"version\":3,\"_self\":\"dbs\\/fZp5AA==\\/colls\\/fZp5AJhvYZY=\\/docs\\/fZp5AJhvYZZ6AAAAAAAAAQ==\\/\",\"_etag\":\"\\\"1f00475d-0000-0200-0000-5f5f6edc0000\\\"\",\"_ts\":1600089820}"
]

【问题讨论】:

  • 感谢所有抽出宝贵时间对我的问题作出反应的用户,但我不确定您为什么投了反对票。如果您也能提供否决票的原因,我将不胜感激。
  • 请展示 .NET 代码以了解您想要实现的目标?如果你只想要一个字符串版本的值,那么在 C# 中对结果调用 `.ToString()' 会更简单。
  • @Noah 我已经添加了代码,我只想将存储的完整 JSON 转换为字符串,同时从数据库中获取它。
  • 请同时显示来自 Cosmos 的示例源项目以及获取后所需的结果项目。
  • 如错误消息所述,ToString() 不是 Cosmos DB 中的系统函数。您不能在查询中使用它。你想在这里做什么?

标签: c# sql .net-core azure-cosmosdb


【解决方案1】:

我将程序集 (Microsoft.Azure.DocumentDB.Core) 升级到版本 2.11.6,它解决了问题。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 2014-01-25
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多