最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

azure cosmosdb - How to query nested properties in Cosmos DB from .NET 8 API - Stack Overflow

programmeradmin2浏览0评论

How to query nested properties in Cosmos DB from .NET 8 API?

When I try to retrieve nested properties with this code, CarModel is null:

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}'");

    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
    };
}

If I try to return the whole CarModel like this, it returns it properly, and I can then filter each nested property, but I don't want to select the whole CarModel from the database:

public async Task<object> GetDriverByIdAsync5(string id)
{
    var queryDefinition = new QueryDefinition($"SELECT c.DriverNumber, c.Name, c.CarModel FROM c WHERE c.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
    };
}

Is there a way to query specific nested properties without selecting whole object and then filter it ?

This is how the data looks like in Cosmos DB:

{
    "id": "4",
    "Name": "William",
    "CarModel": {
        "Make": "Mercedess",
        "Transmission": "Manual",
        "SomeNumber": 145
    },
    "DriverNumber": 12
}

How to query nested properties in Cosmos DB from .NET 8 API?

When I try to retrieve nested properties with this code, CarModel is null:

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}'");

    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
    };
}

If I try to return the whole CarModel like this, it returns it properly, and I can then filter each nested property, but I don't want to select the whole CarModel from the database:

public async Task<object> GetDriverByIdAsync5(string id)
{
    var queryDefinition = new QueryDefinition($"SELECT c.DriverNumber, c.Name, c.CarModel FROM c WHERE c.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
    };
}

Is there a way to query specific nested properties without selecting whole object and then filter it ?

This is how the data looks like in Cosmos DB:

{
    "id": "4",
    "Name": "William",
    "CarModel": {
        "Make": "Mercedess",
        "Transmission": "Manual",
        "SomeNumber": 145
    },
    "DriverNumber": 12
}
Share Improve this question edited Jan 20 at 14:58 David Makogon 71k22 gold badges144 silver badges197 bronze badges asked Jan 20 at 5:34 R.wilsonR.wilson 255 bronze badges 0
Add a comment  | 

1 Answer 1

Reset to default 1

Using your query you retrieve an answer looking like this:

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

Then you try to deserialize into the same class model as your original data even though you've projected it into a different structure. If you use a class that fits the resulting structure it should yield the properties as you want:

//use this for in GetItemQueryIterator<DriverSummary>
public class DriverSummary
{
    public int DriverNumber { get; set; }
    public string Name { get; set; }
    public string Make { get; set; }
    public int SomeNumber { get; set; }
}

Alternatively to give some extra insights you could also edit your query and only return the properties you'd like while keeping the same class using:

SELECT 
  c.DriverNumber, 
  c.Name, 
  { 'Make': c.CarModel.Make, 'SomeNumber': c.CarModel.SomeNumber } AS CarModel 
FROM c 
WHERE c.id = '4'
发布评论

评论列表(0)

  1. 暂无评论