OData V4具有枚举支持,但似乎您只能通过命名空间进行搜索。现在如何通过值而不是文本表示来搜索?
在odata的V3中,您可以查询$filter=Status eq 35
,其中35
在枚举中为Complete
。即使该字段是数据模型中的枚举字段,此方法也可以使用。
现在这个方法在V4中失败了,而是要求命名空间包含枚举的文本表示。
我想让V3支持再次运行,而不必失去odata V4的其他功能。按枚举项的int值搜索似乎比搜索文本更可靠。较旧的odata客户端(例如kendo)不支持逐文的枚举过滤方法。
答案 0 :(得分:15)
要在OData v4中执行此操作,我们可以在初始webapi配置中启用EnumPrefixFree,因此我们不必将完整的枚举命名空间编写为前缀:
public static void Register(HttpConfiguration config)
{
// ...
config.EnableEnumPrefixFree(enumPrefixFree: true);
config.MapODataServiceRoute("odata", "odata", YourEdmModem);
// ...
}
然后,我们可以按String或Int值过滤任何枚举:
$filter=Status eq 'single'
或
$filter=Status eq 1
希望这会有所帮助。
答案 1 :(得分:9)
使用v4,您必须添加名称空间作为前缀,并使用单引号括起值,例如http://services.odata.org/V4/(S(m1bhpaebr1yvzx5vtz5v4ur1))/TripPinServiceRW/People?$ filter = Gender%20eq%20Microsoft.OData.SampleService.Models.TripPin.PersonGender&# 39; 1' ,其中1代表女性。
以下是协议http://docs.oasis-open.org/odata/odata/v4.0/os/abnf/odata-abnf-construction-rules.txt的ABNF的引文:
enum = qualifiedEnumTypeName SQUOTE enumValue SQUOTE
enumValue = singleEnumValue *( COMMA singleEnumValue )
singleEnumValue = enumerationMember / enumMemberValue
enumMemberValue = int64Value