如何从特定集合的URI开始执行存储过程

时间:2016-04-13 00:04:50

标签: c# azure azure-cosmosdb

在一个应用程序中,我目前只有一个指向给定集合的URI。在这个集合上我写了一个存储过程。 proc工作,没有问题,但我需要在.NET应用程序中运行它。

我做了一些挖掘,发现了以下方法:

    public DataOverview GeneralOverviewByClient(int clientId, DateTime? fromDate = null, DateTime? toDate = null)
    {
        DataOverview result = null;

        // Get a Database by querying for it by id
        Database db = _documentDbClient.CreateDatabaseQuery().Where(d => d.Id == "XXXX")
                                                             .AsEnumerable()
                                                             .Single();

        // Use that Database's SelfLink to query for a DocumentCollection by id
        DocumentCollection collection = _documentDbClient.CreateDocumentCollectionQuery(db.SelfLink).Where(c => c.Id == "YYYY")
                                                                                                    .AsEnumerable()
                                                                                                    .Single();

        StoredProcedure storedProcedure = _documentDbClient.CreateStoredProcedureQuery(new Uri(collection.StoredProceduresLink)).Where(p => p.Id == "spGetData")
                                                                                                                                .AsEnumerable()
                                                                                                                                .FirstOrDefault();

        if (storedProcedure != null)
        {
            var response = _documentDbClient.ExecuteStoredProcedureAsync<DataOverview >(storedProcedure.SelfLink, clientId, fromDate, toDate);
            result = response.Result;
        }

        return result;
    }

但是,它不起作用,因为我的URI已经指向集合,语句Database db = _documentDbClient.CreateDatabaseQuery().Where(d => d.Id == "XXXX")失败。

我继续挖掘并发现一个重载,我可以传递存储过程的名称(至少,这就是我的样子),允许我重写代码:

var response = _documentDbClient.ExecuteStoredProcedureAsync<DataOverview>("spGetData", clientId, fromDate, toDate);
if (response != null) { result = response.Response; }

但我仍然没有得到任何结果。我错过了什么/做错了什么?

1 个答案:

答案 0 :(得分:0)

我建议在_self链接上使用UriFactory(以避免额外的网络往返)来构建对存储过程的引用。

试试这个:

var response = _documentDbClient.ExecuteStoredProcedureAsync<DataOverview>(UriFactory.CreateStoredProcedureUri("XXXX", "YYYY", "spGetData")).Result