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

Get to underlying SQL for Cosmos DB Query generated via LINQ

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

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

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

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

这显示在检查器的第一行

{{"query":"SQL HERE"}}

我怎样才能通过代码得到这个?

我正在寻找这个 SQL 以确保它是我想要的并且我可以在我的测试中使用它

保罗

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

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

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

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

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"