OData和Cosmos DB

时间:2019-02-03 02:22:31

标签: c# azure asp.net-core odata azure-cosmosdb

我正在寻求将OData v4用作我正在研究的ASP.NET Core应用程序中的查询工具,而我们的后备持久存储是Cosmos DB。到目前为止,我还没有找到一种使OData查询针对DocumentQuery IQueryable接口运行而又不会遇到某种异常或错误的方法。

我想知道是否存在一种针对Cosmos Document DB(不是Table API)使用OData的“干净”方法,如果可以,如何?到目前为止,我发现的只是一个使用Framework v4.6的非官方库,但没有正式的库,而且我发现有关实现OData的所有文档几乎都针对Entity Framework或内存数据存储。

3 个答案:

答案 0 :(得分:1)

我知道这并不是我所提出问题的最有见地的答案,但是这里的正确答案实际上只是不尝试这样做。如果您所在的位置有人要求您尝试将两种并非真正融合在一起的技术结合在一起,请说不,并处理后果。

答案 1 :(得分:0)

如何处理-将OData转换为SQL,然后在CosmosDB上执行 https://github.com/Azure/azure-odata-sql-js

答案 2 :(得分:0)

OData 与 Cosmos 的集成并不难,如果您使用的是 SQL api,并且您只需要诸如 $orderby、$top 和 $skip 之类的基本内容。这是生成正确 SQL 的问题。

如果你需要更多,那就有点难了。不管怎样,我用这个 NuGet lib 做了一些简单的测试。至少从我的简单测试来看,它似乎有效。

        var oDataToSqlTranslator = new ODataToSqlTranslator(new SQLQueryFormatter());
        var select = oDataToSqlTranslator.Translate(odataQueryOptions, TranslateOptions.SELECT_CLAUSE);
        var where = oDataToSqlTranslator.Translate(odataQueryOptions, TranslateOptions.WHERE_CLAUSE);
        var order = oDataToSqlTranslator.Translate(odataQueryOptions, TranslateOptions.ORDERBY_CLAUSE);
        var top = oDataToSqlTranslator.Translate(odataQueryOptions, TranslateOptions.TOP_CLAUSE);
        var all = oDataToSqlTranslator.Translate(odataQueryOptions, TranslateOptions.ALL);
        
        log.LogInformation("SQL select => " + select);
        log.LogInformation("SQL where  => " + where);
        log.LogInformation("SQL order  => " + order);
        log.LogInformation("SQL all    => " + all);

将此 URL 作为输入:

http://localhost:7071/api/v1/invoices/customer/20?$top=2&$select=CustomerId&$filter=InvoiceNumber eq 'xxx'&orderby=brand

日志显示:

SQL select => SELECT c.CustomerId FROM c 
SQL where  => WHERE c.InvoiceNumber = 'xxx' 
SQL order  => ORDER BY c.InvoiceNumber ASC 
SQL all    => SELECT TOP 2 c.CustomerId FROM c WHERE c.InvoiceNumber = 'xxx' ORDER BY c.InvoiceNumber ASC