2010-10-08 67 views
8

我试图让一些代码使用OData工作。下面的代码似乎不起作用。OData过滤器和Guid字段的问题

ds是OpenDataServiceProxy。

adapterTypeId是Guid的字符串表示形式。

adapterName是一个字符串名称

ds.query('/DataAdapters?$filter=DataAdapterType.DataAdapterTypeId eq guid(\'' + adapterTypeId + '\') and Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, 'Error'); 

上面一行给出以下错误:

在位置0

预期如果删除类型 'System.Boolean' 的

表达过滤器的Guid部分,这样它只是使用“名称”部分,它工作正常。

DataAdapters表字段“DataAdapterTypeId”是外键的“DataAdapterTypes”表DataAdapterTypeId字段。

任何人都可以发现我做错了什么吗?

-------------------编辑----------------------

好的,我已经更改了过滤器,如下所示。我不再收到错误,但获得大量结果,而不是与筛选器匹配的记录。任何人都可以说为什么它不是过滤?

ds.query('/DataAdapters?($filter=Name eq \'' + adapterName + '\' and $filter=DataAdapterTypeId eq guid\'' + adapterTypeId + '\')', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 

回答

14

GUID值需要进行格式化像GUID“” - 看到这样的详细信息:http://www.odata.org/developers/protocols/overview#AbstractTypeSystem 不知道你想达到与DataAdapterType.DataAdatperTypeId什么,但点字符在没有特殊含义过滤表达式,所以它可能不会做你想要的。如果您DataAdapters实体集有型DataAdapterType,然后有一个属性DataAdapterTypeId它的类型是GUID的,那么你可以通过简单地

DataAdapterTypeId eq guid'<value>' 
+0

我做了您推荐的更改,但现在我获取所有记录,而不仅仅是与过滤器匹配的记录。我已将细节添加到我的原始问题中。 – Retrocoder 2010-10-11 08:19:20

+0

不要在$过滤器周围放置parethesis。 – 2010-10-11 12:08:09

+0

如果同时需要两个条件,请使用以下内容: $ filter =名称eq'foo'和描述eq'bar' – 2010-10-11 12:08:44

1

就可以过滤你可以找到更新的URL约定参考here的实体。

1

用的OData v4的什么对我工作在ASP.NET是

'DataAdapterTypeId eq ' + adapterTypeId

观察不带引号或周围的GUID值施放。如果adapterTypeId不是GUID,则会引发错误。