【问题标题】:OData V4 + WebAPI Filter by Int Value of Enum?OData V4 + WebAPI按枚举的Int值过滤?
【发布时间】:2014-10-18 20:53:21
【问题描述】:

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

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

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

我希望在不丢失 odata V4 的其他功能的情况下再次获得对 V3 的支持。通过枚举项的 int 值搜索似乎比搜索文本更可靠。旧的 odata 客户端(例如 kendo)不支持逐文本枚举过滤方法。

【问题讨论】:

  • 我对 V3 不是很熟悉,但据我所知,如果 Status 是枚举,我认为不支持 $filter=Status eq 35。如果我错了,您能否提供规范或示例的链接?
  • OData V3 对枚举一无所知,因此它可以按照您的预期工作,您只需将整数值传递到枚举值后面,就可以得到过滤器。新实现的问题在于,绑定到枚举或存储为 int 的数据库值的组合框无法过滤,因为它们不可能知道命名空间和值,它们只知道 int。因此,我试图找到一种通过 int 而不是命名空间枚举值 $filter 的方法,因为这是需要支持的非常常见的场景。如果 V4 不支持它,我会认为它是一个错误。
  • 要求命名空间前缀的另一个问题是,当枚举被移动到另一个命名空间(例如作为重构的一部分)时,API 会中断。如果可以的话,我能想到的唯一解决方法是在 EDM 模型中将枚举属性建模为 int

标签: asp.net-web-api odata


【解决方案1】:

对于 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

【讨论】:

  • 对,这就是问题所在。他们完全忘记了连接到枚举字段的组合控件的用例。该组合将始终在枚举后面具有 int 值,而不是命名空间混乱。我希望设计该标准的人没有那么短视,以至于他们没有忽略最可能的用例。
【解决方案2】:

要在 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

希望这会有所帮助。

【讨论】:

  • 如果我想让它与我已经存在的路由一起工作,我将如何映射 odata 服务路由?还有什么是“YourEdmModem”?我正在使用通过带有 Select 的 Linq To Entities 返回的 DTO
  • 因为这是标记的答案:他们在最近的版本中删除了这个扩展方法:github.com/OData/WebApi/issues/904你能更新答案吗?
猜你喜欢
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2016-02-27
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多