Как проанализировать строку фильтра Odata в C #?

#c# #azure #odata #azure-table-storage

#c# #azure #odata #azure-table-storage

Вопрос:

Я пытаюсь выполнить операцию с таблицей в хранилище таблиц Azure для извлечения объектов на основе предоставленных фильтров. Я разрешаю пользователям вводить фильтры в текстовое поле.

Мне нужно проанализировать строку фильтра перед отправкой их в Azure. Как я могу это сделать? Существуют ли предопределенные методы или пакет, которые могут выполнять синтаксический анализ этой строки фильтра? Или я должен вручную написать регулярное выражение для выполнения этого синтаксического анализа?

Вот моя операция с таблицей, выполненная без какого-либо анализа, выполненного ранее.

 var myFilterString = "PartitionKey eq '2' and ((PartitionKey eq '1' and RowKey eq '100') or RowKey eq '3')";
var entities = cloudTable.ExecuteQuerySegmented(new TableQuery().Where(myFilterString)).ToList();
  

Заранее спасибо.

Комментарии:

1. Что вы имеете в виду под синтаксическим анализом? Хотите проверить ее достоверность?

2. Да @AthanasiosKataras

Ответ №1:

Нет, такого способа нет. Все дело в том, как она разработана.

  • Запросы генерируют вызовы API через http. Это означает, что библиотека не знает, соответствует ли ваша схема. Он не может знать ваши ключи раздела и являются ли они правильными или нет

  • Проверьте следующий пример

 var query = new TableQuery<SymmetricKey>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "SymmetricKey"));
  

Библиотека явно предназначена для упрощения создания http-вызова и не более того.

  • делегировать создание запроса вашим пользователям — всегда плохая идея.

Этого почти никогда не происходит, поскольку вы не можете контролировать, что будет делать пользователь. Вместо этого создайте список параметров с некоторым количеством html и создайте сравнения, основанные на вводе от вашего пользователя, а не на опции ввода свободного текста.

Комментарии:

1. Я согласен с вашей точкой зрения. Но нет необходимости проверять имена ключей свойств или схему. Суть здесь в том, чтобы просто проверить, является ли это допустимым фильтром, который может быть отправлен в любую таблицу. Использование пар ключей и значений с правильными операторами odata, используемые фрагменты являются правильными и так далее. Есть ли способ?

2. К сожалению, API не предоставляет ничего подобного. Я согласен, что это было бы полезно, но это не так.

3. Я думаю, что вся идея заключается в том, чтобы использовать встроенные функции (генерировать и объединять), чтобы убедиться, что ваш запрос корректен, создав его правильно.