OData integration with Cosmos is not that hard if you're using the SQL api and you only need the basic stuff like $orderby, $top and $skip. It's a matter of generating correct SQL.
If you need more than that it gets a bit harder. Anyway, I did some simple testning with this NuGet lib. It seems to work from my simple tests at least.
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);
Given this URL as input:
http://localhost:7071/api/v1/invoices/customer/20?$top=2&$select=CustomerId&$filter=InvoiceNumber eq 'xxx'&orderby=brand
The logs shows this:
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