Выполнение оператора Contains в запросе linq службы таблиц Azure - PullRequest
0 голосов
/ 06 ноября 2018

Я хотел бы знать, почему / как этот запрос выполняется в таблице хранилища Azure, учитывая, что он «содержит» не разрешены в службе таблиц Azure ? Разве это не делает то, что я думаю, что делает? Он работает и выбирает значения. Кроме того, происходит ли выборка всей таблицы, а затем фильтрация? В отладчике похоже, что он не работает полностью, пока я не запустил ToList ()?

Вот мой код, нижняя строка, которую я использую, содержит.

List<string> partitionIds = new List<string> {"1", "2", "3"};

var table = // get table here...

var result = table.ExecuteQuery(new TableQuery<ConnectionEntity>()); 
var queryResult = result.Where(w => partitionIds.Contains(w.PartitionKey)).ToList();

1 Ответ

0 голосов
/ 06 ноября 2018

Как указано на сайте, который вы указали, служба таблиц Azure не поддерживает проверку содержимого оператора. Поскольку данные сохраняются в среде без сиквела, для оператора содержимого может потребоваться огромное количество энергии, в зависимости от размера вашего набора данных. В данный момент ваш запрос отправляет запрос на сервер, который запрашивает весь набор данных (result.GetAll ()). В вашей системе он оценивает часть содержимого в наборе данных, который был возвращен сервером (result.where (содержит) .tolist ()). Таким образом, сервер не оценивает ваш оператор содержимого, поэтому сервер удовлетворен. Однако вашему серверу все еще нужно проделать большую работу, чтобы оценить это утверждение!

Ваш второй вопрос: стандартный способ получения данных в Entity Framework - это своевременное получение данных. Это означает, что он оценивает запрос только в тот момент, когда нужны данные, то есть в тот момент, когда данные преобразуются в список, когда вы пытаетесь зациклить его или когда вы пытаетесь распечатать его. Единственный способ получить его раньше - это явно загрузить его, вызвав result.Load () вместо .toList (). После этого вы все равно можете вызывать .toList (), но набор результатов был загружен в тот момент, когда вы явно указали .Load ().

...