Azure Cosmos DB SQL API:GetItemLinqQueryable查询结果疑问
Azure Cosmos DB LINQ查询生成语句的等效性问题
我正尝试从Azure Cosmos DB中检索记录,使用以下代码:
queryString = this._container.GetItemLinqQueryable<Family>() .Where(family => family.Address.ZipCode == zipCode) .ToQueryDefinition().QueryText;
我原本预期生成的查询语句为:
SELECT * FROM Family WHERE Family.address.zipcode = 90201
但实际生成的查询语句却是:
SELECT VALUE root FROM root WHERE (root["address"]["zipcode"] = "90210")
请问这两个查询是否等效?若不等效,我遗漏了什么要点?
这两个查询不完全等效,核心差异体现在以下几个要点:
别名与属性路径写法
预期查询中的Family和实际生成的root只是容器的别名不同,逻辑上都指向目标容器内的文档,二者等价;而Family.address.zipcode与root["address"]["zipcode"]两种属性访问方式在Cosmos DB SQL中完全等效,点符号和方括号符号都可用于访问嵌套属性。SELECT子句的返回结构
这是最关键的差异:SELECT *会返回带外层别名键的完整文档,比如结果格式为{"Family": {...}};SELECT VALUE会直接返回文档内容本身,没有外层包裹,结果格式为{...}。
值的类型匹配
预期查询中90201是数字类型,实际生成的"90210"是字符串类型。Cosmos DB是强类型数据库,类型不匹配会导致过滤条件无法匹配数据:如果zipcode字段存储为数字,字符串形式的查询会无结果;反之若存储为字符串,数字形式的查询也会失效。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

