2015-12-08 3 views
0

У меня возникла проблема с использованием агрегата storedproc lumenize https://github.com/lmaccherone/documentdb-lumenize с клиентом .net. Я получаю сообщение об ошибке при попытке передать параметр и запрос в хранимый файл. Ниже мой кодНужна помощь по использованию documentdb-lumenize на .net documentdb client sdk

public async static void QuerySP()  { 
      using (client = new DocumentClient(new Uri(endpointUrl), authorizationKey)) 
      { 
       //Get the Database 
       var database = client.CreateDatabaseQuery().Where(db => db.Id == databaseId).ToArray().FirstOrDefault(); 

       //Get the Document Collection 
       var collection = client.CreateDocumentCollectionQuery(database.SelfLink).Where(c => c.Id == collectionId).ToArray().FirstOrDefault(); 

       StoredProcedure storedProc = client.CreateStoredProcedureQuery(collection.StoredProceduresLink).Where(sp => sp.Id == "cube").ToArray().FirstOrDefault();    


       dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProc.SelfLink, "{cubeConfig: {groupBy: 'publication', field: 'pid', f: 'count'}, filterQuery: 'SELECT pid, publication FROM c'}"); 
       Console.WriteLine("Result from script: {0}\r\n", result.Response); 
      } 
} 

Я получаю следующее сообщение об ошибке, когда выполнение кода

Message: {"Errors":["Encountered exception while executing Javascript. Exception = Error: cubeConfig or savedCube required\r\nStack trace: Error: cubeConfig or savedCube required\n at fn (cube.js:1803:7)\n at __docDbMain (cube.js:1844:5)\n at Unknown script code (cube.js:1:2)"]}

Не уверен, что я сделал неправильно. Я очень благодарен за помощь. Благодарю.

+0

Я предполагаю, что проблема заключается в том, что конфигурация посылается в виде строки. Я не разработчик .NET, но у меня есть виртуальная машина Windows, и я попытаюсь использовать ваш код и вернуться к вам. В то же время, если вы знаете, как создавать простые объекты, попробуйте это и дайте мне знать. –

ответ

1

У вас его почти нет. Проблема в том, что вы отправляете cubeConfig в виде строки. Это должен быть объект. Вот код, который делает это:

string cubeConfigString = @"{ 
    cubeConfig: { 
     groupBy: 'publication', 
     field: 'pid', 
     f: 'count' 
    }, 
    filterQuery: 'SELECT * FROM c' 
}"; 

Object cubeConfig = JsonConvert.DeserializeObject<Object>(cubeConfigString); 
Console.WriteLine(cubeConfig); 

dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>("dbs/dev-test-database/colls/dev-test-collection/sprocs/cube", cubeConfig); 

Console.WriteLine(result.Response); 
+0

BTW, я загрузил куб sproc вручную, используя приложение Azure console. У вас есть код, который читается из файла и загружает строку в этом файле в виде sproc? Если так, я бы с удовольствием это увидел. Кроме того, моя электронная почта larry @ at @ maccherone .dot. com, чтобы отправить код или если у вас есть другие вопросы. Я пришлю вам свой Skype и/или номер телефона, если вы напишите мне по электронной почте. Удачи! –

+0

Привет Ларри, спасибо за вашу помощь. Вышеприведенный код работает хорошо. Для sproc я раньше сохранил sproc в documentdb, поэтому я просто использовал приведенный выше код для извлечения sproc. Я знаю, что пример Microsoft загружает файл и загружает и сохраняет sproc в documentdb https://github.com/Azure/azure-documentdb-dotnet/blob/master/samples/code-samples/ServerSideScripts/Program.cs – Teo

+0

I есть другой вопрос. Когда я использую код, он сгенерировал продолжение, мне нужно сделать цикл while до продолжения = null и суммировать весь счет? И для продолжения, я просто добавляю в исходный cubeConfig следующим образом? строка cubeConfigString = @ "{ cubeConfig: { группеПо: 'Публикация', поле: 'PID', е: 'граф' }, filterQuery: 'SELECT * FROM C', продолжение: 'XXXXXXX' } "; Спасибо. – Teo

1

мой рабочий код

public async static Task QuerySP2() 
    { 
     using (client = new DocumentClient(new Uri(endpointUrl), authorizationKey)) 
     { 
      //Get the Database 
      var database = client.CreateDatabaseQuery().Where(db => db.Id == databaseId).ToArray().FirstOrDefault(); 

      //Get the Document Collection 
      var collection = client.CreateDocumentCollectionQuery(database.SelfLink).Where(c => c.Id == collectionId).ToArray().FirstOrDefault(); 

      StoredProcedure storedProc = client.CreateStoredProcedureQuery(collection.StoredProceduresLink).Where(sp => sp.Id == "cube").ToArray().FirstOrDefault(); 

      string filterQuery = string.Format(@"SELECT * from c"); 

      string cubeConfigString = @"{ 
       cubeConfig: { 
        groupBy: 'publication', 
        field: 'id', 
        f: 'count' 
       }, 
       filterQuery: '" + filterQuery + "'}"; 

      dynamic cubeConfig = JsonConvert.DeserializeObject<dynamic>(cubeConfigString); 
      Console.WriteLine(cubeConfig); 

      string continuationToken = null; 

      dynamic result=null; 
      do 
      { 


       var queryDone = false; 
       while (!queryDone) 
       { 
        try 
        { 
         result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProc.SelfLink, cubeConfig); 
         cubeConfig = result.Response; 
         continuationToken = cubeConfig.continuation; 
         queryDone = true; 
        } 
        catch (DocumentClientException documentClientException) 
        { 
         var statusCode = (int)documentClientException.StatusCode; 
         if (statusCode == 429 || statusCode == 503) 
          System.Threading.Thread.Sleep(documentClientException.RetryAfter); 
         else 
          throw; 
        } 
        catch (AggregateException aggregateException) 
        { 
         if (aggregateException.InnerException.GetType() == typeof(DocumentClientException)) 
         { 

          var docExcep = aggregateException.InnerException as DocumentClientException; 
          var statusCode = (int)docExcep.StatusCode; 
          if (statusCode == 429 || statusCode == 503) 
           System.Threading.Thread.Sleep(docExcep.RetryAfter); 
          else 
           throw; 
         } 
        } 
       } 



      } while (continuationToken != null); 

      Console.WriteLine("Result from script: {0}\r\n", result.Response); 


     } 


    } 
+0

Прохладный. Из любопытства (от .NET noob), нормально ли иметь асинхронный код в цикле while? Мое решение использует рекурсию, но предпочтение этого стиля может быть только из моего фона node.js. –

+0

Кроме того, я не знал, что возможны 503 ошибки. Где вы видите это в документах? –

+0

BTW, я позаимствовал у вас 429 код повтора и обновил свой пример на GitHub. Спасибо за это. –