在x64平台上执行聚合查询时发生异常

Ste*_*son 5 c# azure-cosmosdb

使用聚合运行查询时,我收到以下异常:

Microsoft.Azure.Documents.BadRequestException: 
{"Errors":["Cross partition query only supports 'VALUE <AggreateFunc>' for aggregates."]} 
---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A0B00
Run Code Online (Sandbox Code Playgroud)

我的查询代码是:

var store = "1234";
var sumResults = client.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri("my-data-db", "my-collection"),
$"SELECT SUM(t.totalAmount) FROM t where t.siteData.siteID = '{store}'");
Run Code Online (Sandbox Code Playgroud)

当构建平台设置为x86但设置为x64时失败,我花了一段时间才发现这种方法很好.

我正在使用最新版本的1.12.2软件包

有关如何使x64版本工作的任何想法?

Bru*_*hen 4

根据你的描述,我使用了Microsoft.Azure.DocumentDB 1.12.2在 DocommentDB 模拟器和 Azure DocumentDB 上测试类似的查询。经过一番试验,我发现只有当您对 DocomentDB 模拟器(我当前的版本是 1.11.136.2)使用 SQL 聚合函数(例如 COUNT、MIN、MAX、SUM 和 AVG)并且您的项目构建在 x64 上时,才会出现此问题。

正如此官方文档提到的有关 Azure DocumentDB 的聚合:

聚合支持已推广到所有 DocumentDB 生产数据中心。您可以开始对现有 DocumentDB 帐户运行聚合查询,或通过 SDK、REST API 或 Azure 门户预配新的 DocumentDB 帐户。但是,您必须下载最新版本的SDK才能执行跨分区聚合查询或在 .NET 中使用 LINQ 聚合运算符

我假设您可以通过 LINQ 来利用聚合,如下所示:

var amount=client.CreateDocumentQuery<DocEntity>("/dbs/{your-db-id}/colls/{your-collection-id}",
     new FeedOptions { MaxDegreeOfParallelism = -1 })
      .Where(r => r.siteID == "1234")
      .Sum(r=>r.totalAmount);
Run Code Online (Sandbox Code Playgroud)

我们可以发现上面的查询会生成以下查询:

{"query":"SELECT VALUE Sum(root[\"totalAmount\"]) FROM root WHERE (root[\"siteID\"] =\"1234\") "}

有关更多详细信息,您可以参考此教程