检测到类型不兼容的二进制运算符。找到运算符类型“和”的操作数类型“ Edm.Int32”和“ Edm.Int32”

时间:2018-06-26 16:43:51

标签: azure tsql xamarin azure-sql-database azure-mobile-services

从移动应用程序通过IMobileServiceClient查询Azure数据库时,出现以下查询错误:

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)

它工作正常。

Transact-SQL Microsoft Docs中,指出按位和运算符对两个整数(32位类型)有效。 OData Doc指出edm.Int32表示一个有符号的32位整数值。

我的应用程序中查询的必要部分是

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

f.TypesDbtypes都是C#代码中的整数。 (注意:f.TypesDb通过json序列化映射到Types

那为什么类型不兼容?

1 个答案:

答案 0 :(得分:1)

IMobileServiceClient将代码中的&错误地转换为URL过滤器参数中的andand被解释为逻辑和,因此类型Edm.Int32与之不兼容。

无法在URL的过滤器参数中使用按位和

作为一种肮脏的解决方法,我现在在数据库中存储一个用逗号分隔的int字符串,然后解析回去,而不是存储一个表示flag enum的整数。