Как мне найти записи в табличном хранилище Azure, которые не соответствуют массиву значений?

#javascript #azure #azure-mobile-services

#javascript #azure #azure-mobile-services

Вопрос:

Я пытаюсь выполнить операцию типа ‘doesNotContainAllObjectsInArray’ в Azure Mobile Services. Например, допустим, у меня есть таблица с именем Number , и в этой таблице находятся записи с такими «числовыми» значениями: 11111, 22222, 33333, 44444.

Я хочу иметь возможность написать запрос, который позволит мне передать массив чисел, которые мне конкретно не нужны, например: [11111,44444] должен выдавать мне с [22222, 33333] .

Я пытался использовать JavaScript в моем where операторе, но я получаю сообщение об ошибке, в котором говорится, что выражение не поддерживается. Это то, что я пробовал:

 var numberTable = tables.getTable('Number');
var ignoreNumbers = ['11111', '44444'];
numberTable.where(function(numbers) {
    return (numbers.indexOf(this.number) > -1);
}, ignoreNumbers).read({
    success: function(foundNumbers) {
        console.log('Found '   foundNumbers.length   ' numbers!');
    },
    error: function(error) {
        console.error('Error with query! '   error);
    }
});
  

Примечание: Я не могу жестко закодировать значения ignoreNumbers, поскольку этот массив получен из предыдущего запроса.

Кто-нибудь может порекомендовать, как я мог бы выполнить подобный запрос? Нужно ли мне создавать инструкцию SQL и выполнять ее с помощью mssql ? (… возможно ли это вообще с табличным хранилищем?)

Ответ №1:

Вы описываете оператор SQL Except, который не поддерживается в запросах к таблицам. Единственный способ, который я нашел для этого, — загрузить таблицу в память (часто это невозможно из-за размера), а затем использовать LINQ для выполнения запроса Except.

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

1. Спасибо! К сожалению, я использую Azure Mobile Services, поэтому у меня ограничено использование JavaScript, поэтому LINQ не подходит.

Ответ №2:

Мне удалось решить эту проблему, создав SQL-запрос и выполнив его через request.service.mssql объект, примерно так:

SELECT * FROM Number WHERE (number != '11111' amp;amp; number != '22222')

Часть запроса WHERE создается путем итерации ignoreNumbers массива и построения инструкции SQL с помощью конкатенации строк.

Не уверен, что это самая эффективная вещь в мире, но на самом деле там будет всего пара чисел (возможно, 5-10), и пока это, кажется, работает.