OData / AspNetCoreOData

ASP.NET Core OData: A server library built upon ODataLib and ASP.NET Core
Other
457 stars 158 forks source link

DateOnly quering not working #545

Open alc86 opened 2 years ago

alc86 commented 2 years ago

Hi,

We are currently working on a project with .Net 6, EF Core 6, Npgsql provider and AspNetCore.OData. There is still a problem with the Expression generation because the expression tree contains elements with 'System.Nullable`1[Microsoft.OData.Edm.Date]'. I think these elements should be of type DateOnly.

julealgon commented 2 years ago

There is still a problem with the Expression generation because the expression tree contains elements with 'System.Nullable`1[Microsoft.OData.Edm.Date]'. I think these elements should be of type DateOnly.

What problem? Can you elaborate a bit more and include a repro of the issue?

I think these elements should be of type DateOnly.

I assume you mean OData's own custom date only class and not .NET6's type, right? .NET6 DateOnly and TimeOnly are not currently supported by OData.

alc86 commented 2 years ago

I thought this is already implemented https://github.com/OData/ModelBuilder/issues/22

max1997dc commented 1 year ago

HI! any news?

NikAtIdeally commented 1 year ago

Seems to be working in regular filter/select, but when trying to group by "DateOnly" field it throws "System.NullReferenceException: Object reference not set to an instance of an object."

Can anyone suggest a workaround to this issue for now? Maybe way to cast to string in OData model builder? Or force it to think its a DateTime?

String is: "Results?apply=filter(projectId eq 1982)/groupby((projectId,answerText,responseDate),aggregate(weight with sum as sumWeight,id with countdistinct as count))"

That response date is causing the problem. Replacing it with any other column (including datetime) works just fine. But when its DateOnly I get that null ref.

imaa commented 10 months ago

Getting this error when using DateOnly and Time Only The LINQ expression 'DbSet() .Where(e => e.WorkDate.Value.Year 10000 + e.WorkDate.Value.Month 100 + e.WorkDate.Value.Day == __p_0)' could not be translated. Either rewrite the query in a form that can be translated,

or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

EF Core 7 Net Core 6

rsgilbert commented 8 months ago

Similar error when I do a patch request. I am required to provide date only eg "2022-01-20". If I provide a datetime in the JSON eg "0001-02-24T00:00:00.000Z" I get an error saying : System.NullReferenceException: Object reference not set to an instance of an object.

dennis-garavsky commented 8 months ago

Hello, OData Team.

Question #1. What's the current support of DateOnly and TimeOnly types in the latest ASP.NET Core Web API/OData versions (primarily for .NET 8+ and EF Core 8+) and limitations? Question #2. If OData does not support these newest types as of now, what is your vision/plans for the scenarios our customers having below?

Motivation: Because of the EF Core 8 breaking change and a huge adoption of EF Core 8 by developers after .NET 8 release last year (a tweet by MSFT), we at DevExpress want to support these newest types for the following CRUD scenarios:

Thanks, Dennis Garavsky Product Manager at https://www.devexpress.com/ dennis@devexpress.com

julealgon commented 8 months ago

@habbes @mikepizzo ☝️

ThomasHeijtink commented 7 months ago

Hi, any news?

ArnaudB88 commented 7 months ago

I am getting the following error when trying to filter on a sql nullable 'Date' column (DateOnly? type in .NET):

Microsoft.OData.ODataException: A binary operator with incompatible types was detected. Found operand types 'System.Nullable_1OfDateOnly' and 'Edm.Date' for operator kind 'GreaterThanOrEqual'.

  Stack Trace: 
BinaryOperatorBinder.PromoteOperandTypes(BinaryOperatorKind binaryOperatorKind, SingleValueNode& left, SingleValueNode& right, TypeFacetsPromotionRules facetsPromotionRules)
ODataUriResolver.PromoteBinaryOperandTypes(BinaryOperatorKind binaryOperatorKind, SingleValueNode& leftNode, SingleValueNode& rightNode, IEdmTypeReference& typeReference)
StringAsEnumResolver.PromoteBinaryOperandTypes(BinaryOperatorKind binaryOperatorKind, SingleValueNode& leftNode, SingleValueNode& rightNode, IEdmTypeReference& typeReference)
BinaryOperatorBinder.BindBinaryOperator(BinaryOperatorToken binaryOperatorToken)
MetadataBinder.BindBinaryOperator(BinaryOperatorToken binaryOperatorToken)
MetadataBinder.Bind(QueryToken token)
FilterBinder.BindFilter(QueryToken filter)

Is there a solution at the moment, or do we have to wait for a fix in the repo?

ovirta commented 5 months ago

Any timeframe for DateOnly/TimeOnly support for odata?

We have sql data of Date type (instead of DateTime) and would love to be able to use DateOnly properties on entities.

Currently our odata queries time out with large top and skip parameter values if DateOnly properties are included in the $select clause. Removing dateonly properties fixes the issue and queries finish almost instantly.

Edit: We are also using ef core so is it possible that odata is trying to do client side parsing of the data? (that ef core does not support anymore imo)