OData 和 Cosmos DB

我希望在我正在处理的 ASP.NET 核心应用程序中实现 OData v4 作为查询工具,我们的后备持久性存储是 Cosmos DB。到目前为止,我还没有找到一种方法来使 OData 查询针对 DocumentQuery IQueryable 接口运行,而不会遇到某种异常或错误。

我想知道是否有一种“干净”的方式来利用OData来对抗Cosmos Document DB(而不是Table API),如果是这样,如何?到目前为止,我所发现的只是一个使用 Framework v4.6 的非官方库,但没有官方的,而且我发现的有关实现 OData 的所有文档几乎完全针对实体框架或内存数据存储运行。


慕莱坞森
浏览 128回答 3
3回答

幕布斯6054654

我知道这并不是对我的问题最有见地的答案,但这里的正确答案是不要试图这样做。如果你曾经处于这样一个位置,有人要求你试图将两种并不真正结合在一起的技术结合在一起,那就说“不”并处理后果。

慕后森

如果您使用的是SQL api,并且只需要$orderby,$top和$skip等基本内容,则OData与Cosmos的集成并不难。这是一个生成正确的 SQL 的问题。如果你需要更多,它会变得有点困难。无论如何,我用这个NuGet库做了一些简单的测试。它似乎至少从我的简单测试中起作用。        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 

蝴蝶不菲

怎么样 - 将OData转换为SQL,然后在CosmosDB上执行它 https://github.com/Azure/azure-odata-sql-js
打开App,查看更多内容
随时随地看视频慕课网APP