Запрос хранилища таблицы 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;
Если я запустил запрос без проверки нулевого значения, он работает нормально. Я знаю, что возможным решением было бы запустить второй запрос в коллекции, который возвращает этот запрос. Я не против делать это, если нужно, но хотел бы знать, смогу ли я сначала использовать этот подход для работы.
Кто-нибудь видит что-то очевидное, я делаю неправильно?
Ответы
Ответ 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;