You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 API中如何查询Cosmos DB的嵌套属性?

问题原因

你遇到的CarModel为null的问题,根源是查询返回的JSON结构和Driver类的属性不匹配:
当执行SELECT c.DriverNumber, c.Name, c.CarModel.Make, c.CarModel.SomeNumber时,Cosmos DB返回的是扁平结构结果,不存在CarModel嵌套对象:

{
  "DriverNumber": 12,
  "Name": "William",
  "Make": "Mercedess",
  "SomeNumber": 145
}

而你的Driver类定义里包含CarModel属性,反序列化时因为找不到对应的CarModel键,该属性会被初始化为null。

解决方案

有两种可行方式实现“只查询特定嵌套属性,无需拉取整个对象”:

1. 调整SQL查询,包装嵌套属性结构

修改SELECT语句,把需要的嵌套属性包装成CarModel对象,让返回的JSON结构和Driver类匹配:

public async Task<object> GetDriverByIdAsync6(string id)
{
    // 用参数化查询避免SQL注入风险,禁止直接拼接id
    var queryDefinition = new QueryDefinition(@"
        SELECT 
            c.DriverNumber, 
            c.Name, 
            {
                Make: c.CarModel.Make,
                SomeNumber: c.CarModel.SomeNumber
            } AS CarModel 
        FROM c WHERE c.id = @id")
        .WithParameter("@id", id);

    var queryResult = await _container.GetItemQueryIterator<Driver>(queryDefinition).ReadNextAsync();
    var driver = queryResult.FirstOrDefault();

    return new
    {
        DriverNumber = driver.DriverNumber,
        Name = driver.Name,
        Make = driver.CarModel.Make,
        SomeNumber = driver.CarModel.SomeNumber
    };
}

此时Cosmos返回的JSON会包含CarModel嵌套对象,能正确映射到Driver类的属性:

{
  "DriverNumber":12,
  "Name":"William",
  "CarModel":{
    "Make":"Mercedess",
    "SomeNumber":145
  }
}

2. 使用DTO类接收查询结果

创建仅包含所需字段的DTO(数据传输对象),直接接收扁平的查询结果,避免依赖Driver类的结构:

// 定义匹配查询结果的DTO类
public class DriverCarInfoDto
{
    public int DriverNumber { get; set; }
    public string Name { get; set; }
    public string Make { get; set; }
    public int SomeNumber { get; set; }
}

// 查询方法
public async Task<object> GetDriverByIdAsync6(string id)
{
    var queryDefinition = new QueryDefinition(@"
        SELECT c.DriverNumber, c.Name, c.CarModel.Make, c.CarModel.SomeNumber 
        FROM c WHERE c.id = @id")
        .WithParameter("@id", id);

    var queryResult = await _container.GetItemQueryIterator<DriverCarInfoDto>(queryDefinition).ReadNextAsync();
    var driverInfo = queryResult.FirstOrDefault();

    return new
    {
        driverInfo.DriverNumber,
        driverInfo.Name,
        driverInfo.Make,
        driverInfo.SomeNumber
    };
}

这种方式更轻量,无需修改查询返回结构,直接用DTO匹配扁平字段即可。

重要提醒

永远不要直接把用户输入(比如id)拼接到SQL语句中,这会引发SQL注入风险,必须使用WithParameter方法做参数化查询。

内容的提问来源于stack exchange,提问作者R.wilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:52:37