Как правильно преобразовать DateTime в DateOnly и сравнить значения в .Net 8.0 с С#?

Объяснение

Я пытаюсь сравнить некоторые данные таблицы базы данных с сегодняшней датой, а затем показать их в порядке Id.

Мне удалось найти способ преобразовать сегодняшнюю дату и время в дату, но при загрузке страницы я получаю сообщение об ошибке:

ArgumentNullException: значение не может быть нулевым. (Параметр «источник»)

System.Linq.ThrowHelper.ThrowArgumentNullException (аргумент ExceptionArgument)

Судя по отладчику, ошибка такая:

System.InvalidCastException: «Невозможно привести объект типа «System.DateOnly» к типу «System.IConvertible»

Вопрос

Что не так с этим кодом, как правильно преобразовать DateTime в DateOnly?

Код:

@foreach (var item in Model.PL.Where(p => p.PidDate == DateOnly.FromDateTime(DateTime.UtcNow.AddDays(i))).OrderBy(p => p.Id))  
{}

где PidDate в таблице определяется как:

public DateOnly PidDate { get; set; }

Полная ошибка, показанная в браузере:

An unhandled exception occurred while processing the request.
ArgumentNullException: Value cannot be null. (Parameter 'source')

System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)

Stack Query Cookies Headers Routing 

ArgumentNullException: Value cannot be null. (Parameter 'source')
       
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)  
System.Linq.Enumerable.Where<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate)

        TESTNET8.Pages.Pro.Pages_Pro_Historiku+<>c__DisplayClass206_0+<<ExecuteAsync>b__0>d.MoveNext() in Historiku.cshtml

Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()  
TESTNET8.Pages.Pro.Pages_Pro_Historiku.ExecuteAsync() in Historiku.cshtml   
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)  
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, bool invokeViewStarts)  
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)  
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, string contentType, Nullable<int> statusCode)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultAsync>g__Logged|22_0(ResourceInvoker invoker, IActionResult result)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0<TFilter, TFilterAsync>(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|28_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Program+<>c+<<<Main>$>b__0_10>d.MoveNext() in Program.cs

await next(); 

Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)  
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

И DateTime, и DateOnly являются структурами, поэтому они не могут быть источником NRE. Единственные две возможности в этой строке кода:

  • Model
  • Model.PL

Используйте отладчик и найдите то, что вы передаете как нулевое.

Я получаю это: System.InvalidCastException: «Невозможно привести объект типа «System.DateOnly» к типу «System.IConvertible».

Fillo 10.06.2024 18:53

Решите, это NRE или недействительный каст? Трассировка вашего стека ясно показывает NRE, так почему же вы сейчас заявляете о недопустимом приведении? Можете ли вы просто опубликовать полностью компилируемый минимальный проект, демонстрирующий проблему?

Blindy 10.06.2024 19:38

Извините, но это то, что показал отладчик. Я только что загрузил ошибку, показанную в браузере, а затем ошибку, показанную в отладчике.

Fillo 10.06.2024 22:05
Ответ принят как подходящий

Сначала вы можете проверить, пуста ли модель в вашем методе. Если модель в методе не имеет данных:

public IActionResult Index()
{
    var model = new ViewModel
    {
    
       
    
    };

    return View(model);
}

Вид:

@model ViewModel


@foreach (var item in Model.PL.Where(p => p.piddate == DateOnly.FromDateTime(DateTime.UtcNow.AddDays(1))).OrderBy(p => p.Id))
{
    <div>
        
        <p>PidDate: @item.Id</p>
        <p>PidDate: @item.piddate</p>
    </div>
}
<div id = "result"></div>

После того, как я добавил соответствующие примеры данных:

public IActionResult Index()
{
    var model = new ViewModel
    {
        PL = new List<PidDate>
    {
        new PidDate { Id = 1, piddate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-2)) },
        new PidDate { Id = 2, piddate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-1)) },
        new PidDate { Id = 3, piddate = DateOnly.FromDateTime(DateTime.UtcNow) },
        new PidDate { Id = 4, piddate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(1)) },
        new PidDate { Id = 5, piddate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(2)) },

    
    }
    };

    return View(model);
}

Типы могут быть преобразованы обычным образом.

Что касается интерфейса IConvertible, этот интерфейс предоставляет методы для преобразования значения экземпляра типа реализации в тип общеязыковой среды выполнения с эквивалентным значением. Общеязыковые типы среды выполнения включают Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char и String. Если значимого преобразования типа среды CLR не происходит, будет создано исключение InvalidCastException. Для получения подробной информации вы можете обратиться к этому документу. и проверить, есть ли в вашем методе метод, который использует интерфейс IConvertible для преобразования объектов DateOnly. Чтобы узнать, как использовать datetime для преобразования в тип dateonly, вы можете обратиться к этому ️ 🔁документ.

данные динамически передаются прямо из базы данных (в .net 7.0 все работает нормально). Таблица правильно называется в модели, как вы тоже показали. В таблице Не все дни имеют значения. Вот что меня сбивает с толку. Я читаю всю предоставленную вами документацию.

Fillo 12.06.2024 10:56

Другие вопросы по теме