Обнаружен бинарный оператор с несовместимыми типами. Найдены типы операндов 'Edm.Int32' и 'Edm.Int32' для вида оператора 'And' - PullRequest
0 голосов
/ 26 июня 2018

Когда я запрашиваю свою базу данных Azure через IMobileServiceClient из моего мобильного приложения, я получаю следующую ошибку для запроса:

https://domain.azurewebsites.net/tables/Entities?$filter=(substringof('f',OriginalName) and ((Types and 1) ne 0))&$orderby=Start&$skip=0&$top=20&$select=OriginalName,OriginalSlogan,Description,Start,End,Types,Id,Version,CreatedAt,UpdatedAt,Deleted

The query specified in the URI is not valid. A binary operator with incompatible types was detected. Found operand types 'Edm.Int32' and 'Edm.Int32' for operator kind 'And'."

Однако при запросе к БД напрямую с помощью

Select * from Entities where ((Types & 1) <> 0)

отлично работает.

В Документах Microsoft Transact-SQL указано, что побитовый оператор и оператор допустимы для двух целых чисел (которые являются 32-битными типами). OData Doc утверждает, что edm.Int32 представляет 32-разрядное целое число со знаком.

Важная часть моего запроса в моем приложении -

query = query.Where(f => (f.TypesDb & types) != 0);

И f.TypesDb, и types являются целыми числами в коде C #. (Примечание: f.TypesDb отображается на Types через сериализацию JSON)

Так почему же типы несовместимы?

1 Ответ

0 голосов
/ 07 сентября 2018

IMobileServiceClient неправильно переводит & в коде в and в параметре фильтра URL. and интерпретируется как логический и , поэтому тип Edm.Int32 несовместим с этим.

Невозможно использовать поразрядно и в параметре фильтра URL.

В качестве грязного обходного пути теперь я сохраняю в базе данных разделенную запятыми строку int s и анализирую ее вместо хранения целого числа, представляющего flag enum.

...