Cosmos DB嵌套对象SQL查询如何转换为等效可用的LINQ语句
问题根因及修正方案
你代码的错误主要来自属性不匹配、过滤条件缺失、访问修饰符和类型错误四个方面,以下是完整修正方案:
1. 修正实体类定义
需修复访问修饰符、属性名与Cosmos字段映射、类型不匹配问题:
using System.Text.Json.Serialization; // 若使用Newtonsoft.Json则替换为对应命名空间 public class Product { public int id {get;set;} // 新增type字段对应SQL中的过滤条件 public string type {get;set;} public IList<Size> Size {get;set;} } public class Size { public int id {get;set;} public IList<Variant> Variant {get;set;} } public class Variant { public int id {get;set;} // 注意属性名为带s的Options,与类定义保持一致 public IList<Option> Options {get;set;} } public class Option { // 映射Cosmos中的optionID字段,同时修改为字符串类型匹配SQL中的值格式 [JsonPropertyName("optionID")] public string OptionId {get;set;} public IList<OptionAvailability> OptionsAvas {get;set;} }
2. 修正LINQ查询语句
补充缺失的type过滤条件,修正属性名引用错误:
// 要获取所有匹配的Option就用ToList,要单个匹配就用FirstOrDefault var matchedOptions = query // 对应SQL中c.type = 'product'的过滤条件,原代码遗漏 .Where(product => product.type == "product") .SelectMany(product => product.Size) .SelectMany(size => size.Variant) .SelectMany(variant => variant.Options) .Where(option => option.OptionId.Equals(optionId, StringComparison.OrdinalIgnoreCase)) .ToList();
错误说明
- 原实体类所有属性无
public修饰符,Cosmos DB LINQ提供程序无法读取私有属性,导致嵌套集合全部被识别为null - 原LINQ代码错误引用
variant.Option,但Variant类中对应属性名为Options(带s),属性名不匹配无法读取数据 - 遗漏了SQL中
c.type = 'product'的过滤条件,查询范围不符合预期 - 原Option类中id定义为int类型,但SQL中optionID的值为字符串格式
'869',类型不匹配导致过滤条件始终不生效
内容的提问来源于stack exchange,提问作者lesioTheProgrammer
相关产品推荐
相关产品推荐

