При запросе таблицы хранилища Azure я получаю исключение.
Вот мой запрос:
tableClient.QueryAsync<Resource>(resource => resource.PartitionKey == projectId.ToString()
&& String.Equals(resource.FullName, fullName, StringComparison.InvariantCultureIgnoreCase));
resource.FullName
и fullName
относятся к типу string
.
Но это исключение...
Неверное количество аргументов, предоставленных для вызова метода «Boolean Equals (System.String, System.String, System.StringComparison)» (параметр «метод»)
И точно так же, если я добавлю дополнительное условие (перед String.Equals
)...
&& !String.IsNullOrWhiteSpace(resource.FullName)
... это влечет за собой исключение...
Метод IsNullOrWhiteSpace не поддерживается.
Если я изменю сравнение строк на...
resource.FullName.ToLower() == fullName.ToLower()
... затем мне говорят, что ToLower
не поддерживается.
Что тут происходит? Почему я не могу вызвать String.Equals
или String.IsNullOrWhiteSpace
свойство типа string
? Я что-то не понимаю, и resource.FullName
на самом деле не string
?
Пакет SDK пытается преобразовать ваш оператор LINQ в запрос, который может быть обработан ресурсом хранилища таблиц Azure для возврата соответствующих элементов. Методы, которые вы пытаетесь вызвать в нем, также не могут быть преобразованы, потому что SDK не реализовал их. Либо из-за того, что в пакете SDK отсутствует реализация, либо из-за того, что хранилище таблиц Azure не поддерживает аналогичные методы в своих запросах.
Для вашего сценария это связано с тем, что хранилище таблиц Azure не поддерживает запросы без учета регистра. Таким образом, вам нужно либо изменить свои данные, чтобы они всегда были в нижнем или верхнем регистре. Или получить элементы и отфильтровать элементы локально.
Пожалуйста, следуйте приведенным ниже советам и проверьте, помогает ли это.
String.Equals
до String.Compare?String.Compare
с опцией StringComparison.OrdinalIgnoreCase для достижения сравнения без учета регистра:tableClient.QueryAsync<Resource>(resource =>
resource.PartitionKey == projectId.ToString() &&
String.Compare(resource.FullName, fullName, StringComparison.OrdinalIgnoreCase) == 0);
String.IsNullOrEmpty
вместе с методом String.Trim:tableClient.QueryAsync<Resource>(resource =>
resource.PartitionKey == projectId.ToString() &&
!String.IsNullOrEmpty(resource.FullName) &&
!String.IsNullOrEmpty(resource.FullName.Trim()));
Надеюсь это поможет.
Да, это работает. Итак, Azure Table Storage реализовал
String.Compare
, но неString.Equals
? И реализуетString.IsNullOrEmpty
, но неString.IsNullOrWhiteSpace
? Есть ли список этих методов, реализованных хранилищем таблиц Azure?