检测到类型不兼容的二元运算符。找到类型相等的操作数类型 edm.string 和 edm.guid
Posted
技术标签:
【中文标题】检测到类型不兼容的二元运算符。找到类型相等的操作数类型 edm.string 和 edm.guid【英文标题】:A binary operator with incompatible types was detected. Found operand types edm.string and edm.guid for kind equal 【发布时间】:2015-12-28 15:00:31 【问题描述】:我使用微风谓词实现过滤器。在实体框架中使用 BreezeJs 和 ASP.NET WebAPI(Breeze 服务器端)
谓词如下所示:
var predicate = breezeProvider.breeze.Predicate.create('serialNumber', '==', $scope.filter.serialNumber);
predicates.push(predicate);
当我执行查询时。 Breeze 抛出异常并显示以下消息:
$scope.filter.serialNumber 是一个字符串,serialNumber 是一个 GUID 属性
网址如下。
http://localhost:51969/breeze/WarehouseProductTransactions/GetProducts?$filter=(StatusId ne 3d) and (WarehouseId eq 1d) and (AuthorizedADUserId eq 'bTdbnW8t6Uu4D4KHCoQOhg==') and (SerialNumber eq guid'1b9d065e-eb48-4f3d-883c-2c841771a3e8')&$ orderby=Id&$top=5&$expand=Inventory,AuthorizedADUser&$inlinecount=allpages&)
注意sn-p:
(序列号 eq guid'1b9d065e-eb48-4f3d-883c-2c841771a3e8')
我的服务器端如下:
[EnableBreezeQuery(MaxNodeCount = 200)]
public IQueryable<WarehouseProductTransactionDetail> GetProducts()
return _contextProvider.Context.WarehouseProductTransactionDetails;
我正在想办法解决这种情况,但不知道。
感谢任何帮助
【问题讨论】:
是否有可能来自客户端的序列号被理解为字符串,然后服务器端代码尝试与 GUID 进行比较。我对这些特定技术了解不多,但我猜服务器需要在比较之前将值从客户端转换为 GUID。或者从服务器到字符串的值。 【参考方案1】:在 Breeze 查询中比较 userId 时,我遇到了同样的问题。 Breeze 在 OData 查询中附加“guid”。
我可以通过将 .toType("entityTypeName")
附加到微风查询来解决此问题。
let query = new breeze.EntityQuery().from('orders');
let predicate = breeze.Predicate.create("CreatedBy", "==", userId);
query = query.where(predicate).toType("Order");
【讨论】:
以上是关于检测到类型不兼容的二元运算符。找到类型相等的操作数类型 edm.string 和 edm.guid的主要内容,如果未能解决你的问题,请参考以下文章
数据类型 text 和 varchar 在 equal to 运算符中不兼容。