获取通过 LINQ 生成的 Cosmos DB 查询的底层 SQL

Pau*_*aul 5 linq iqueryable azure-cosmosdb azure-cosmosdb-sqlapi

我正在使用 Linq 创建对 cosmos 的查询

这将被转换为 SQL,然后运行该 SQL 来进行搜索

var modelName = "Mondeo";
var baseQuery = client.CreateDocumentQuery<Car>(StaticSettings.ProjectionsCollectionUri,
  new FeedOptions { MaxItemCount = maxItemCount, PartitionKey = new PartitionKey(partitionKey) })
                .Where(order => car.ModelName == modelName);
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码并在此语句后放置一个断点,我可以看到生成的原始 SQL 查询

这显示在检查器的第一行

{{"query":"SQL HERE"}}
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过代码达到这个目的?

我希望得到这个 SQL 以确保它是我想要的并且我可以在我的测试中使用它

保罗

bug*_*d87 12

ToString()假设您使用的是 Visual Studio,默认情况下调试器将在检查器中向您显示任何给定对象的输出。

有了这些知识,您就可以使用以下代码检索相同的查询字符串对象。

var serializedQuery = baseQuery.ToString(); // "{{\"query\":\"SQL HERE\"}}"

结果似乎是一个序列化的 JSON 对象,它包装了实际的 SQL 查询。您可以使用以下代码轻松地使用Newtonsoft.Json提取 SQL 。

var sql = JObject.Parse(serializedQuery)["query"].Value<string>(); \\ "SQL HERE"

编辑:在当前版本的 SDK 中,解决方案将如下所示。

var baseQuery = container
               .GetItemLinqQueryable<Car>(
                    requestOptions: new QueryRequestOptions
                    {
                        MaxItemCount = maxItemCount,
                        PartitionKey = new PartitionKey(partitionKey)
                    }
                )
               .Where(order => car.ModelName == modelName);

var sql = baseQuery.ToQueryDefinition().QueryText; // "SQL HERE"
Run Code Online (Sandbox Code Playgroud)