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

Jam*_*ock 6 odata asp.net-web-api

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

在OData的可以查询V3 $filter=Status eq 35,这里35Complete在枚举.即使该字段是数据模型中的枚举字段,此方法也可以使用.

现在,此方法在V4中失败,而是要求命名空间具有枚举的文本表示.

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

Cht*_*lek 16

要在OData v4中执行此操作,我们可以在初始webapi配置中启用EnumPrefixFree,因此我们不必将完整的枚举命名空间编写为前缀:

public static void Register(HttpConfiguration config)
{
    // ...
    config.EnableEnumPrefixFree(enumPrefixFree: true);
    config.MapODataServiceRoute("odata", "odata", YourEdmModem);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我们可以通过String或Int值过滤任何枚举:

$filter=Status eq 'single'
Run Code Online (Sandbox Code Playgroud)

要么

$filter=Status eq 1
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 因为这是标记的答案:他们在最近的版本中删除了这个扩展方法:https://github.com/OData/WebApi/issues/904 你能更新答案吗? (3认同)

Tan*_*nfu 9

使用v4,您必须添加名称空间作为前缀并使用单引号括起值,例如http://services.odata.org/V4/(S(m1bhpaebr1yvzx5vtz5v4ur1))/TripPinServiceRW/People?$ filter = Gender% 20eq%20Microsoft.OData.SampleService.Models.TripPin.PersonGender'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
Run Code Online (Sandbox Code Playgroud)

  • 对,这就是问题所在.他们完全忘记了连接到枚举字段的组合控件的用例.组合将始终具有枚举后面的int值,而不是命名空间混乱.我希望设计标准的人不是那么荒谬的短视,他们不会忽视最可能的用例. (6认同)