Asp.net-Web-Api

OData V4 + WebAPI按列舉的Int值過濾?

  • January 19, 2016

OData V4 支持列舉,但您似乎只能通過命名空間進行搜尋。現在如何通過值而不是文本表示進行搜尋?

在 odata 的 V3 中,您可以查詢列舉中的$filter=Status eq 35where 。即使該欄位是數據模型中的列舉欄位,此方法也會起作用。35``Complete

現在這個方法在 V4 中失敗了,而是需要具有列舉文本表示的命名空間。

我想在不失去 odata V4 的其他功能的情況下再次獲得 V3 支持。通過列舉項的 int 值搜尋似乎比搜尋文本更可靠。較舊的 odata 客戶端(例如 kendo)不支持逐文本列舉過濾方法。

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

希望這可以幫助。

對於 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

引用自:https://stackoverflow.com/questions/25490430