CosmosDB查询中使用StringComparison失效并触发DocumentQueryException报错
解决Cosmos DB查询中使用StringComparison导致的DocumentQueryException
这个错误的核心原因是Cosmos DB的LINQ查询提供者不支持String.Equals带有StringComparison参数的重载。当你在查询表达式中使用这个重载时,Cosmos无法将其正确转换为对应的SQL查询,反而错误地将表达式的返回类型识别为System.Int32(这是解析过程中的内部异常),而Cosmos要求查询必须返回可枚举的结果集合,因此抛出了这个错误。
解决方案:使用Cosmos支持的忽略大小写匹配方式
你可以通过以下两种常用方式实现忽略大小写的精确匹配,这些写法能被Cosmos的LINQ提供者正确转换为SQL查询:
方法1:使用ToLower()统一转换为小写比较
await repo.WhereAsync(something => something.Name.ToLower() == "something".ToLower());
对应的Cosmos SQL查询会被转换为:
SELECT * FROM c WHERE LOWER(c.Name) = LOWER("something")
方法2:使用ToUpper()统一转换为大写比较
await repo.WhereAsync(something => something.Name.ToUpper() == "something".ToUpper());
对应的Cosmos SQL查询会被转换为:
SELECT * FROM c WHERE UPPER(c.Name) = UPPER("something")
额外注意事项
如果你的WhereAsync实现内部有自定义的表达式处理逻辑,建议检查是否存在将查询表达式错误转换为非可枚举结果的情况(比如误调用了Count()或其他返回单个值的方法),确保它正确返回IQueryable<T>类型的查询对象,让Cosmos能够延迟执行查询并返回正确的结果集合。
内容的提问来源于stack exchange,提问作者Solanki Sachin
相关产品推荐
相关产品推荐

