Объяснение
Я пытаюсь сравнить некоторые данные таблицы базы данных с сегодняшней датой, а затем показать их в порядке 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)





И DateTime, и DateOnly являются структурами, поэтому они не могут быть источником NRE. Единственные две возможности в этой строке кода:
ModelModel.PLИспользуйте отладчик и найдите то, что вы передаете как нулевое.
Решите, это NRE или недействительный каст? Трассировка вашего стека ясно показывает NRE, так почему же вы сейчас заявляете о недопустимом приведении? Можете ли вы просто опубликовать полностью компилируемый минимальный проект, демонстрирующий проблему?
Извините, но это то, что показал отладчик. Я только что загрузил ошибку, показанную в браузере, а затем ошибку, показанную в отладчике.
Сначала вы можете проверить, пуста ли модель в вашем методе. Если модель в методе не имеет данных:
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 все работает нормально). Таблица правильно называется в модели, как вы тоже показали. В таблице Не все дни имеют значения. Вот что меня сбивает с толку. Я читаю всю предоставленную вами документацию.
Я получаю это: System.InvalidCastException: «Невозможно привести объект типа «System.DateOnly» к типу «System.IConvertible».