запрос сложного типа в Azure Table - PullRequest
0 голосов
/ 03 мая 2018

Я новичок в концепции NoSql. Исходя из мышления «ModelFirst», я обычно сначала проектирую свои модели. У меня есть модель следующим образом.

public class Book
{
    public string Name { get; set; }
    [EntityPropertyConverter(typeof(Category))]
    public List<Category> Categories { get; set; }
}
public class Category
{
    public string Name { get; set; }
}

Студенческий класс сложного типа и

[EntityPropertyConverter]
Атрибут

помогает сериализовать категории перед записью в таблицу Azure и десериализовать при обратном чтении.

Книга может принадлежать к нескольким категориям. Мой вопрос: если кто-то должен искать книгу по одной из n категорий, как мы можем это сделать.

Таблица Azure поддерживает запросы, подобные приведенным ниже

TableQuery.GenerateFilterCondition("Categories", QueryComparisons.Equal, JsonConvert.SerializeObject(???))

Но с этим я не могу получить требуемый результат.

пожалуйста, прокомментируйте, если мой общий подход неверен.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Существует способ записи и запроса сложных объектов в хранилище таблиц. Это метод TableEntity.Flatten в SDK, чтобы сначала сгладить объект. TableEntity.ConvertBack метод, чтобы прочитать его обратно и преобразовать в оригинальный сложный объект. Он не выполняет полную сериализацию, он сохраняет собственные свойства как EntityProperty для сплющенного объекта, поэтому каждое свойство может запрашиваться индивидуально.

При этом свойства типа IEnumerable/ICollection не поддерживаются текущей версией TableEntity.Flatten api. Тем не менее пакет nuget Object Flattener Recomposer версии 2.0 поддерживает свойства коллекционного / перечислимого / индексированного типа:

https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Таким образом, вместо этого вы можете использовать этот nuget для записи ваших сложных типов в табличное хранилище, если ваши объекты имеют такой тип свойств индексированных / перечислимых типов. Этот пакет nuget выполняет те же функции, что и API в SDK (это оригинальный код методов TableEntity.Flatten / ConvertBack), но в дополнение он преобразует свойства типа enumerable / collection в строки json перед записью в хранилище таблиц. и он создает исходный сложный объект обратно при прозрачном чтении из таблицы, вам не нужно беспокоиться о десериализации плоского объекта обратно в исходный сложный тип.

Возвращаясь к исходному вопросу, можно записывать и считывать сложные объекты в табличное хранилище либо методами, которые я упоминал в SDK, либо в последнем пакете nuget API ObjectFlattenerRecomposer. Хотя, если вы хотите запросить отдельный объект из свойства типа List, все равно будет сложно, потому что список, как я уже упоминал, будет в формате строки json на таблице.

0 голосов
/ 28 мая 2018

запрос сложного типа в таблице Azure

Насколько я понимаю, не поддерживается в настоящее время. Если мы хотим сохранить данные сложного типа в хранилище таблиц, нам нужно SerializeObject, чтобы сохранить строку и сохранить их в хранилище таблиц

Согласно поддерживаемым операторам сравнения таблиц , мы могли бы знать, что он не поддерживает contains. Кажется, у нас нет способа отфильтровать ожидаемый результат.

Если возможна Azure cosmos DB (таблица API), я рекомендую вам попробовать.

Формат документа:

{
    "id": "test",
    "Book": {
        "Categories": [
            {
                "Name": "Category1"
            },
            {
                "Name": "Category2"
            }
        ],
        "Name": "book1"
    }
}

Строка запроса:

SELECT * FROM root WHERE (ARRAY_CONTAINS(root.Book.Categories, {"Name": "Category2"}, true)or ARRAY_CONTAINS(root.Book.Categories, {"Name": "Category4"}, true)) 

Запрос от портала Azure:

![enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...