I'm trying to implement a custom function for OData which should convert string -> string. But all sources in the internet including MS docs are very unclear about how can it be done.
Consider following registration:
private static ODataConventionModelBuilder AddOrder(this ODataConventionModelBuilder builder)
{
var entity = builder.EntitySet<Order>(typeof(Order).Name.ToLower());
entity.EntityType.HasKey(x => x.Id);
var function = entity.EntityType.Function("ToLower2");
function.IsComposable = true;
function.SupportedInFilter = true;
function.Parameter<string>("s");
function.Returns<string>();
return builder;
}
Here is an OData controller:
[ODataRoutePrefix("order")]
public sealed class OrdersODataController : ODataController
{
[HttpGet]
[EnableQuery(HandleNullPropagation = HandleNullPropagationOption.True)]
[ODataRoute]
public IQueryable<Order> Get()
{
return TestHelper.GetMyQueryable():
}
[HttpGet]
public string ToLower2(string s)
{
return s;
}
}
Now when calling it:
curl 'http://localhost:10100/api/odata/order?$filter=((contains(Default.ToLower2(SomeField),+%27gdgdg%27))&$select=Id&skip=0&$top=5'
The response is:
"message":"The query specified in the URI is not valid. An unknown function with name 'Default.ToLower2' was found. This may also be a function import or a key lookup on a navigation property, which is not allowed."
Is it possible to implement a custom function like this?