Сглаживание объекта при выборе документа Cosmos DB

У меня есть следующий документ в Cosmos DB

{
  "id": "c6c7a79a-3351-8be8-2700-b0c9414c1622",
  "_rid": "mdRtAJiE1cEBAAAAAAAAAA==",
  "_self": "dbs/mdRtAA==/colls/mdRtAJiE1cE=/docs/mdRtAJiE1cEBAAAAAAAAAA==/",
  "_etag": "\"00000000-0000-0000-35f2-3baea11001d5\"",
  "FedId": "1023157382",
  "UniqueIdentifier": "00003089421",
  "UniqueIdentifierNumeric": 3089421,
  "Item": {
    "LastUpdatedDate": "2019-07-08T02:36:20",
    "OrderNumber": "2013282",
    "QueueRank": 2
  }
}

И следующий класс C #

public class Item
{
    public string FedId { get; set; }
    public string UniqueIdentifier { get; set; }
    public DateTime LastUpdatedDate { get; set; }
    public string OrderNumber { get; set; }
    public int QueueRank { get; set; }
}

Как с помощью Cosmos SQL API выбрать документ и сопоставить его с классом Item?

Вот что я пробовал:

var result = _client.CreateDocumentQuery<Item>(collectionLink, new SqlQuerySpec
{
    QueryText = @"
        SELECT c.FedId, c.UniqueIdentifier, i.*
        FROM c JOIN i IN c.Item
        WHERE
            sie.FedId = '1023157382'
    "
});

По сути, помимо свойств документа карты мне также нужно сгладить свойство Item в документе Cosmos. Ожидаемый результат:

Console.WriteLine(result.FedId); // return "1023157382"
Console.WriteLine(result.UniqueIdentifier); // return "00003089421"
Console.WriteLine(result.LastUpdatedDate); // return "2019-07-08T02:36:20"
Console.WriteLine(result.OrderNumber); // return "2013282"
Console.WriteLine(result.QueueRank); // return 2

Я также пробовал выполнять запросы с объединениями, но, похоже, не работает со свойством без массива. https://github.com/Azure/azure-cosmos-dotnet-v2/blob/d17c0ca5be739a359d105cf4112443f65ca2cb72/samples/code-samples/Queries/Program.cs#L421-L435


person stack247    schedule 21.07.2019    source источник


Ответы (1)


DocumentDB находит глубокий ключ: значение

Вам не нужно выполнять соединение, если у вас нет свойства массива. Вы можете просто использовать c.Item.LastUpdatedDate.

Результат должен выглядеть примерно так:

var result = _client.CreateDocumentQuery<Item>(collectionLink, new SqlQuerySpec
{
    QueryText = @"
        SELECT c.FedId, c.UniqueIdentifier, c.Item.LastUpdatedDate, c.Item.OrderNumber, c.Item.QueueRank
        WHERE
            c.FedId = '1023157382'
    "
});

С другой стороны, вы также можете попробовать использовать вместо этого поставщика linq. Создайте класс для вашего документа верхнего уровня (например, MyDocument) и его части, а затем используйте select для сопоставления значений.

Будет работать примерно так:

var result = _client.CreateDocumentQuery<MyDocument>(collectionLink)
    .Select(document => new Item{
        FedId = document.FedId,
        UniqueIdentifier = document.FedId,
        LastUpdatedDate = document.Item.LastUpdatedDate,
        OrderNumber = document.Item.OrderNumber,
        QueueRank = document.Item.QueueRank
    });

PS: Используйте SelectMany, если у вас есть свойства массива, вместо записи соединений SQL.

person Alex AIT    schedule 22.07.2019