OData V4 + WebAPI按Enum的Int值过滤?

时间:2014-08-25 16:34:30

标签: asp.net-web-api odata

OData V4具有枚举支持,但似乎您只能通过命名空间进行搜索。现在如何通过值而不是文本表示来搜索?

在odata的V3中,您可以查询$filter=Status eq 35,其中35在枚举中为Complete。即使该字段是数据模型中的枚举字段,此方法也可以使用。

现在这个方法在V4中失败了,而是要求命名空间包含枚举的文本表示。

我想让V3支持再次运行,而不必失去odata V4的其他功能。按枚举项的int值搜索似乎比搜索文本更可靠。较旧的odata客户端(例如kendo)不支持逐文的枚举过滤方法。

2 个答案:

答案 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