ExecuteStoredProcedureAsyn c (), возвращающий разные результаты - PullRequest
0 голосов
/ 31 января 2020

Короче говоря, хранимая процедура в cosmosDB возвращает 2 при выполнении внутри портала и возвращает 0 при вызове из ExecuteStoredProcedureAsync() в моем c# консольном приложении. Правильный ответ: 2

Вот хранимая процедура:

JS:

function countItems() {
    var context = getContext();
    var collection = context.getCollection();
    var collectionLink = collection.getSelfLink();
    var response = context.getResponse();

    var query = "SELECT * FROM c";

    var isAccepted = collection.queryDocuments(
        collectionLink,
        query,
        function(err, documents, responseOptions) {
            if (err) {
                throw err;
            }
            response.setBody(documents.length);
        }
    );
}

Когда я запускаю это с портала azure, он возвращает правильный результат: 2.

/////////////////////

Вот C# звонок:

C#

private static async Task ExecuteStoredProc(string spId, CosmosContext cosmosContext)
{
    using (var client = new CosmosClient(cosmosContext.Endpoint, cosmosContext.MasterKey))
    {
        var container = client.GetContainer(cosmosContext.DbId, cosmosContext.ContainerId);
        var scripts = container.Scripts;
        var pk = new PartitionKey(cosmosContext.DbId);
        var result = await scripts.ExecuteStoredProcedureAsync<string>(spId, pk, null);
        var message = result.Resource;

        Console.WriteLine(message);
    }
}

Когда я запускаю это из консольного приложения C#, оно возвращает 0

В чем дело?

1 Ответ

2 голосов
/ 31 января 2020

На основании моего теста вы не можете правильно установить PartitionKey.

Если вы установили ключ раздела, вам нужно передать правильный ключ раздела.

static void Main(string[] args)
{
    using (var client = new CosmosClient(Endpoint, Key))
    {
        // With Partition Key
        var container = client.GetContainer("TestDB", "Demo");

        var scripts = container.Scripts;

        // With Partition Key
        var pk = new PartitionKey("B");
        var result =scripts.ExecuteStoredProcedureAsync<string>("length", pk, null).GetAwaiter().GetResult();

        var message = result.Resource;
        Console.WriteLine(message);
    }
    Console.ReadLine();
}

enter image description here

enter image description here

Если ключа раздела нет, то вам необходимо пропуск PartitionKey.None

static void Main(string[] args)
{
    using (var client = new CosmosClient(Endpoint, Key))
    {
        // Without Partition Key
        var container = client.GetContainer("ToDoList", "Items");

        var scripts = container.Scripts;

        //Without Partition Key
        var result = scripts.ExecuteStoredProcedureAsync<string>("length", PartitionKey.None, null).GetAwaiter().GetResult();

        var message = result.Resource;
        Console.WriteLine(message);
    }
    Console.ReadLine();
}

enter image description here

enter image description here

...