Вопрос

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

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

Это немальная версия запроса 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;

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Вот что я сделал, чтобы проверить, если цена (int32?) Null:

not (Price lt 0 or Price gt 0)

Я предполагаю, что в вашем случае вы можете сделать то же самое в LINQ, тестируя, если foobar.termination_date меньше или больше, чем dateTime.utcown, например. Что-то вроде этого:

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top