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