Al ejecutar una consulta utilizando agregados, recibo la siguiente excepción:

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

Mi código de consulta es:

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}'");

Me tomó un tiempo descubrir que esto funciona bien cuando la plataforma de compilación está configurada en x86 pero falla cuando está configurada en x64.

Estoy usando la última versión del paquete 1.12.2

¿Alguna idea sobre cómo hacer que la versión x64 funcione?

6
Steve Jackson 20 mar. 2017 a las 18:40

2 respuestas

La mejor respuesta

Según su descripción, usé Microsoft.Azure.DocumentDB 1.12.2 para pruebe la consulta similar tanto en DocomentDB Emulator como en Azure DocumentDB. Después de algunas pruebas, descubrí que este problema solo ocurre cuando está utilizando las funciones agregadas de SQL (por ejemplo, COUNT, MIN, MAX, SUM y AVG) contra DocomentDB Emulator (mi versión actual es 1.11.136.2) y su proyecto está construido en x64 .

Como este documento menciona acerca de los agregados con Azure DocumentDB:

El soporte agregado se ha implementado en todos los centros de datos de producción de DocumentDB. Puede comenzar a ejecutar consultas agregadas en sus cuentas de DocumentDB existentes o aprovisionar nuevas cuentas de DocumentDB a través de los SDK, la API REST o el Portal de Azure. Sin embargo, debe descargar la última versión de los SDKs para < strong> realizar consultas agregadas de particiones cruzadas o usar operadores agregados LINQ en .NET.

Supuse que podría aprovechar los agregados con LINQ de la siguiente manera:

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);

Podríamos encontrar que la consulta anterior generaría la siguiente consulta:

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

Para obtener más detalles, puede consultar este tutorial.

4
Bruce Chen 21 mar. 2017 a las 06:31

Necesita poner valor en su consulta, así

SELECCIONE EL CONTEO DE VALOR (1) DE C

4
Grey Wolf 15 nov. 2017 a las 04:16