Подтвердить что ты не робот

Запрос хранилища таблицы azure для нулевых значений

Кто-нибудь знает, как правильно обращаться к хранилищу таблиц azure для нулевого значения. Из того, что я прочитал, это возможно (хотя есть ошибка, которая предотвращает ее на хранилище разработки). Тем не менее, я продолжаю получать следующую ошибку, когда я делаю это в реальном облачном хранилище:

Один из входов запроса недействителен.

Это скрытая версия запроса LINQ, который я собрал вместе.

var query = from fooBar in fooBarSVC.CreateQuery<FooBar>("FooBars")
        where fooBar.PartitionKey == kPartitionID
            && fooBar.Code == kfooBarCode
            && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
            && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime() || fooBar.Termination_Date == null)
        select fooBar;

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

Кто-нибудь видит что-то очевидное, я делаю неправильно?

4b9b3361

Ответ 1

Проблема в том, что поскольку в хранилище таблиц azure нет схемы, нулевой столбец фактически не существует. Вот почему ваш запрос недействителен. в хранилище таблиц нет такой вещи, как пустой столбец. Вы можете сделать что-то вроде хранения пустой строки, если вам действительно нужно. На самом деле, хотя основная проблема здесь заключается в том, что хранилище таблиц Azure действительно не построено для запроса любыми столбцами, отличными от ключей разделов и строки строки. Каждый раз, когда вы делаете запрос на одном из этих нестандартных столбцов, вы выполняете сканирование таблицы. Если вы начнете получать много данных, у вас будет очень высокий уровень времени ожидания запросов. Я бы предложил настроить ручную индексацию для этих типов запросов. Например, вы можете хранить одни и те же данные в одной таблице, но с разными значениями для ключа Row. В конечном счете, если ваше приложение не получает сумасшедшего высокого использования, я бы просто использовал SQL Azure, поскольку он будет намного более гибким для типов запросов, которые вы делаете.

Обновление: у Azure есть отличное руководство по дизайну хранилища таблиц, которое я бы рекомендовал прочитать. http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

Ответ 2

У меня просто возникла эта проблема, и я нашел хороший маленький трюк ниндзя, чтобы на самом деле проверить его на нули. Хотя я использую интерфейс хранилища Azure напрямую, я на 90% уверен, что он будет работать и для LINQ, если вы сделаете то же самое.

Вот что я сделал, чтобы проверить, является ли Price (Int32?) Нулевым:

not (Price lt 0 or Price gt 0)

Я предполагаю, что в вашем случае вы можете сделать то же самое в LINQ, проверив, например, fooBar.Termination_Date меньше или больше DateTime.UtcNow. Что-то вроде этого:

where fooBar.PartitionKey == kPartitionID
  && fooBar.Code == kfooBarCode
  && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
  && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime()
  || (not (fooBar.Termination_Date < DateTime.UtcNow 
            or fooBar.Termination_Date > DateTime.UtcNow))
select fooBar;