Search code examples
c#asp.net-mvccontrollerodata

No coercion operator is defined between types Microsoft.OData.Edm.Date and System.Nullable System.DateTimeOffset


We are building a odata webservice and are facing a conversion problem.

The following odata query url is used :

"http://some.url.ext/test/endPoint?$filter=SomeDate ge 1990-01-01"

In our odata-filtered enumeration, SomeDate is a Nullable<DateTime> DateTime?.

Nevertheless, it looks like odata controller casted it in Nullable<DateTimeOffset> DateTimeOffset?

And then complain it can't compare a Microsoft.OData.Edm.Date and a System.Nullable System.DateTimeOffset

The error is :

The query specified in the URI is not valid. No coercion operator is defined between types 'Microsoft.OData.Edm.Date' and 'System.Nullable`1[System.DateTimeOffset]'.

No coercion operator is defined between types 'Microsoft.OData.Edm.Date' and 'System.Nullable`1[System.DateTimeOffset]'.

System.InvalidOperationException at System.Linq.Expressions.Expression.GetUserDefinedCoercionOrThrow(ExpressionType coercionType, Expression expression, Type convertToType)
       at System.Linq.Expressions.Expression.Convert(Expression expression, Type type, MethodInfo method)
       at System.Web.OData.Query.Expressions.ExpressionBinderBase.CreateConvertExpression(ConvertNode convertNode, Expression source)
       at System.Web.OData.Query.Expressions.FilterBinder.BindConvertNode(ConvertNode convertNode)
       at System.Web.OData.Query.Expressions.FilterBinder.Bind(QueryNode node)
       at System.Web.OData.Query.Expressions.FilterBinder.BindBinaryOperatorNode(BinaryOperatorNode binaryOperatorNode)
       at System.Web.OData.Query.Expressions.FilterBinder.Bind(QueryNode node)
       at System.Web.OData.Query.Expressions.FilterBinder.BindExpression(SingleValueNode expression, RangeVariable rangeVariable, Type elementType)
       at System.Web.OData.Query.Expressions.FilterBinder.BindFilterClause(FilterBinder binder, FilterClause filterClause, Type filterType)
       at System.Web.OData.Query.Expressions.FilterBinder.Bind(FilterClause filterClause, Type filterType, IServiceProvider requestContainer)
       at System.Web.OData.Query.FilterQueryOption.ApplyTo(IQueryable query, ODataQuerySettings querySettings)
       at System.Web.OData.Query.ODataQueryOptions.ApplyTo(IQueryable query, ODataQuerySettings querySettings)
       at System.Web.OData.EnableQueryAttribute.ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
       at System.Web.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor, ODataQueryContext queryContext)
       at System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)

The error is triggered when calling the ODataController.Ok() method with an IEnumerable of our output data.

We are using Micrtosoft.Odata.Edm 7.0.0


Solution

  • Ok solved it by using a DateTimeOffset date format in the filter ! Just use it as follow :

    "http://some.url.ext/test/endPoint?$filter=SomeDate ge 1990-01-01T00:00:00Z"
    

    Hope this helps